object literal和Sys.WebForms.PageRequestManager.getInstance()。add_endRequest issue

时间:2011-07-21 22:35:50

标签: javascript jquery asp.net updatepanel master-pages

我所拥有的是ASP.NET MasterPage / ContentPage,其中ContentPage使用UpdatePanel并将UpdateMode设置为“Conditional”。此ContentPage基本上是一个包含3个视图的MultiView:Setup,Confirm和Complete。我有点击导航按钮,转到服务器,做他们需要做的事情,最后更新UpdatePanel,以便它可以回来。我的问题在于我的JavaScript。

我有以下名为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;

    }

};


最后,但并非最不重要的是,这一切都得到了启动:

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

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


我的问题是,当它首次触发时Page.init()一切都很好,但是,当你点击一个按钮时,它会立即抛出错误:未捕获的TypeError:无法设置属性'all'的undefined 。现在我试图解决这个问题,但我很茫然。似乎这种情况发生在PAGE的根目录下的 ANY 嵌套对象文字中。像PAGE.panel这样的直接属性工作正常,但只要您需要访问PAGE.buttons.allPAGE.views.setup,它就会抛出此错误。我以前从未见过这个。

有任何想法吗?

2 个答案:

答案 0 :(得分:0)

为面板属性使用getter。看到其他所有东西看起来都是面板的属性,这应该这样做 - 你可能会在回发期间丢失对面板的引用,所以不是一次获取对象,而是每次都得到它:

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

同样,如果我只有this.panel = $ get(myElement),然后我的部分页面更新会破坏我最初创建对象时返回到this.panel的节点,this.panel将变为未定义。使用吸气剂。

希望有所帮助 - 快乐编码。

编辑:

实际上 - 现在我再次查看它,你可能想要为所有属性使用getter而不是依赖于get_panel()。find(..)for currentView,例如,我会做另一个在那里吸气:

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

答案 1 :(得分:0)

我没有在this函数中使用PAGE.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"); });

    }

}