YUI Datatable в панели не регистрирует события - PullRequest
0 голосов
/ 15 декабря 2009

У меня есть данные в диалоговом окне панели. Данные отображаются нормально ... однако .... никаких событий не регистрируется, понравилась сортировка, выбор строки и т.д. Ничего. Не колбаса. Если данные не находятся внутри панели, тогда выбор строк, сортировка и т. Д. Работают отлично.

Вот мой код. Я был бы всегда благодарен, если бы вы указали мне правильное направление.

YAHOO.util.Event.addListener(window, "load", function(){
function processPostpone(e)
{
      var dom = YAHOO.util.Dom;
      if(dom.get("user_rejected").value==3)
      {
          window.alert(dom.get("user_rejected_impossible").value);  
      }
      else
      {
            var elTarget = YAHOO.util.Event.getTarget(e);    
            var attendance_id = elTarget.id;
            attendance_id = attendance_id.substring(7, 15);
            var handleYes = function() {
                // postpone session
                var callback = {
                     success : function(o) 
                     {
                        if(o.responseText=="true")
                        {
                            // succesfully postponed session
                            var callback2 = 
                            {
                                    success: function(o) 
                                    {
                                        try 
                                        {
                                            messages = YAHOO.lang.JSON.parse(o.responseText);
                                        }
                                        catch (x) 
                                        {
                                            alert("JSON Parse failed!");
                                            return;
                                        }
                                       if(messages.ResultSet.count > 0)
                                       {
                                           // there are some other available sessions
                                            var columndefs = [
                                                              {key:"name", label: "Session", sortable:false, resizeable:false},
                                                              {key:"location", label: "Location", sortable:false, resizeable:false},
                                                              {key:"start_date", label: "Start Date", sortable:false, resizeable:false}
                                                             ];

                                            var datasource = new YAHOO.util.DataSource(messages);
                                            datasource.responseType = YAHOO.util.DataSource.TYPE_JSON;
                                            datasource.responseSchema = {
                                                    resultsList: "ResultSet.Result",
                                                    fields: ["name","location","start_date"]
                                            };

                                            var datatable = new YAHOO.widget.DataTable("possibleSessionsDataTable", columndefs, datasource, {rowSingleSelect:true, zindex:999});
                                            datatable.subscribe("rowMouseoverEvent", datatable.onEventHighlightRow);
                                            datatable.subscribe("rowMouseoutEvent", datatable.onEventUnhighlightRow);
                                            datatable.subscribe("rowClickEvent", datatable.onEventSelectRow);
                                            datatable.focus();

                                            var handleSubmit = function() {
                                               // test
                                               alert('You clicked submit');
                                            }

                                            var panel = new YAHOO.widget.Panel("panel2", { width:"600px", visible:false,  modal: false, fixedCenter: true, draggable:false, close:false } );
                                            panel.setHeader("Other Sessions You May Be Able To Attend");
                                            panel.setBody(dom.get("other_possible_sessions").innerHTML);
                                            panel.setFooter('<div id="panelFooter"></div>');

                                            panel.showEvent.subscribe(function() {
                                                var button1 = new YAHOO.widget.Button({
                                                    type: 'button',
                                                    label: 'Submit',
                                                    container: 'panelFooter'
                                                });                                                         
                                                button1.on("click", handleSubmit);
                                            }, panel, true);

                                            panel.render("container");
                                            panel.show();
                                       }
                                    },
                                    failure: function(o)
                                    {

                                    }
                                }
                                var conn = YAHOO.util.Connect.asyncRequest("POST", "/ajax/possiblesessions.json?id=" + attendance_id, callback2);
                            }
                            else
                            {
                                window.alert("Sorry, there was an error.");
                            }
                         },
                         failure : function(o) 
                         {
                             window.alert("Sorry, there was an error.");
                         }
                     }
                var conn = YAHOO.util.Connect.asyncRequest("POST", "/ajax/postponesession.json?id=" + attendance_id, callback);

                var loading = new YAHOO.widget.Panel("wait",  
                        { width:"300px", 
                          fixedcenter:true, 
                          close:false, 
                          draggable:true, 
                          zindex:4,
                          modal:false,
                          visible:false
                        } 
                    );
            this.hide();

            /*loading.setHeader("Rejecting session...");
            loading.setBody('<img src="http://l.yimg.com/a/i/us/per/gr/gp/rel_interstitial_loading.gif" />');
            loading.render(document.body);
            loading.show();*/
            };

            var handleNo = function() {
                this.hide();
            };

            var dialog  =  new YAHOO.widget.SimpleDialog("dialog", 
                         { width: "300px",
                           fixedcenter: true,
                           visible: false,
                           draggable: false,
                           close: true,
                           text: document.getElementById("reject_alert_text").innerHTML,
                           modal: false,
                           icon: YAHOO.widget.SimpleDialog.ICON_HELP,
                           constraintoviewport: true,
                           buttons: [ { text:"Yes", handler:handleYes, isDefault:true },
                                      { text:"No",  handler:handleNo } ]
                         } );
            dialog.setHeader("Reject session?");
            // Render the Dialog
            dialog.render(document.body);
            dialog.show();
      } 
}
// create postpone button
var elms = YAHOO.util.Dom.getElementsByClassName("reject");

// loop over all the elements and attach a click event
for(var i=0,j=elms.length;i<j;i++)
{
    var el = document.getElementById(elms[i].id);
    YAHOO.util.Event.addListener(el, "click", processPostpone);
} 

var tabView = new YAHOO.widget.TabView('tabs');

});

Прошу прощения за фрагмент кода.

Заранее спасибо.

1 Ответ

1 голос
/ 16 декабря 2009

Хотя я не могу сказать точную проблему из предоставленного вами фрагмента кода, я сделаю обоснованное предположение и предположу, что вы, вероятно, имеете дело с проблемами области действия.

Другими словами, это может быть не из-за того, что события не запускаются, а из-за того, что прикрепленные к ним функции находятся вне области видимости, или что функциональность в обратных вызовах дает сбой из-за переменных области действия. (YUI иногда может подавлять ошибки с событиями)

Многие функции yui принимают третий и четвертый аргументы, которые позволяют вам указать область, в которой выполняется обратный вызов. Например.

obj.subscribe("onEvent", this.onEvent, this, true);

Приведенный выше фрагмент установит 'this' в onEvent к текущему значению this, возможно, текущего объекта.

Я бы начал с рассмотрения объема, в котором выполняются функции обратного вызова. Попробуйте console.log (это); Вы можете обнаружить, что это не то, что вы ожидаете.

...