2011-07-21 18 views
0

我得到的是一个ASP.NET MasterPage/ContentPage,其中ContentPage利用UpdatePanel并将UpdateMode设置为“有条件”。这个ContentPage基本上是一个MultiView,它有3个视图:设置,确认和完成。我有导航按钮,点击后,转到服务器,做他们需要做的,最后更新UpdatePanel,以便它可以回来。我的问题在于我的JavaScript。对象字面和Sys.WebForms.PageRequestManager.getInstance()。add_endRequest问题

我有一个名为PAGE以下全局文本对象:

PAGE = { 

    panel : undefined, 
    currentView: undefined, 

    buttons : { 

     all : undefined, 
     cont : undefined 

    }, 

    views : { 

     setup  : {}, 
     confirm  : {}, 
     complete : {} 

    } 

}; 


PAGE.init()功能如下:

PAGE.init = function() { console.log("PAGE.init() fired"); 

    this.panel = $('div[id$="Panel_Page"]'); 
    this.currentView = this.panel.find('input[id$="Hidden_CurrentView"]').val(); 
    this.buttons.all = this.panel.find('input[type="submit"]'); 
    this.buttons.cont = this.panel.find('input[id$="Button_Continue"]'); 

    this.buttons.all.click(function() { PAGE.panel.hide(); }); 

    switch (this.currentView) { 

     case "confirm"  : this.views.confirm.init(); break; 
     case "complete"  : this.views.complete.init(); break; 
     default    : this.views.setup.init();  break; 

    } 

}; 


最后,但并非最不重要的,这一切又踢off by:

// Fire events on initial page load. 
PAGE.init(); 

// Fire events for partial postbacks. 
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(PAGE.init); 


我的问题是,当它第一次火灾Page.init()一切都很好,但是,当你点击一个按钮,它立即引发的错误:遗漏的类型错误:无法设置属性未定义“所有”。现在我试图弄清楚这一点,但我不知所措。看起来好像ANY发生在PAGE的根之外的嵌套对象字面值。像PAGE.panel这样的直接属性工作得很好,但只要您需要访问PAGE.buttons.allPAGE.views.setup,就会引发此错误。我从来没有见过这个。

有什么想法吗?

回答

0

而不是使用thisPAGE.init()函数内的,我用PAGE和纠正问题。显然this不是指PAGE而是PAGE.init。仍然不知道为什么,因为我在别处做这个,它的工作原理。

例如,以下使用的this作品,它没有比我如何在我的OP使用它不同:

PAGE.views.setup = { 

    buttons : { 

     all : undefined, 
     cont : undefined 

    }, 

    init: function() { 

     var self = this, 
      buttons = self.buttons; 

      buttons.all = PAGE.panel.find('input[type="submit"]'); 

     buttons.all.click(function() { alert(this.id + " clicked"); }); 

    } 

} 
0

使用面板属性的吸气剂。看到其他所有东西似乎都是面板的属性,这应该做到这一点 - 您可能会在回发期间失去对面板的引用,因此不要每次都获取对象,而是每次获取它:

get_panel:function() {return $ get(“Panel_Page”); }

再一次,如果我只有this.panel = $ get(myElement),然后我的部分页面更新销毁最初创建我的对象时返回给this.panel的节点,则this.panel将变为undefined。使用吸气剂。

希望有帮助 - 快乐编码。

编辑:

其实 - 现在,我看它一遍,你可能想使用的getter你所有的性质,而不是依靠get_panel()的发现(..)为currentView,为例如,我会在那里做另一个getter:

get_currentView:function(){return $ get(“Hidden_​​CurrentView”,this.get_panel()); }

+0

对不起,我迟到的反应,我一直在休假。我不确定在每次发送init()函数时如何失去我的引用。更不用说,面板甚至不在我的问题所在,因为按钮的基本属性是由于某种原因返回undefined。再看看底部的解释。也许它会更好地理解我在做什么。 –

+0

@Scott - 你是否尝试过吸气剂来代替任何属性?只是想知道如果你不认为这是问题,或者你尝试了,它不工作,你知道这不是问题。每次我遇到类似的问题时,都是因为我失去了对节点的引用。是否可以发布一些更多的代码,以便我可以尝试在我的最后重现问题? – Brian

+0

你缺少的是它不是关于引用DOM的属性。失去这种引用是针对那些在每次部分回发时都没有重新初始化的人,这在我的示例中最后一行代码中是明显的。我遇到的问题是我的对象字面属性'PAGE.buttons'变得不确定。 –