объектный литерал и Sys.WebForms.PageRequestManager.getInstance (). add_endRequest проблема - PullRequest
0 голосов
/ 22 июля 2011

У меня есть ASP.NET MasterPage / ContentPage, где ContentPage использует UpdatePanel с UpdateMode, установленным в «Условный».Этот ContentPage в основном представляет собой MultiView, который имеет 3 вида: «Настройка», «Подтверждение» и «Завершение».У меня есть кнопки навигации, которые при нажатии идут на сервер, делают то, что им нужно, и, наконец, обновляют панель обновления, чтобы она могла вернуться.Моя проблема заключается в моем 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() все замечательно, однако, когда вы нажимаете кнопку, сразу выдается ошибка: Uncaught TypeError: Невозможно установить свойство 'all' из неопределенного .Теперь я попытался понять это, но я в растерянности.Кажется, что это происходит с ANY литералом вложенного объекта от корня PAGE.Непосредственные свойства, такие как PAGE.panel, работают просто отлично, но как только вам необходим доступ к PAGE.buttons.all или PAGE.views.setup, выдается эта ошибка.Я никогда не видел этого раньше.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 02 августа 2011

Вместо использования 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"); });

    }

}
0 голосов
/ 22 июля 2011

Используйте геттер для вашего свойства панели. Поскольку все остальное, по-видимому, является свойством панели, это должно сработать - возможно, вы теряете ссылку на панель во время обратной передачи, поэтому вместо получения объекта один раз получите его каждый раз:

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

Опять же, если у меня просто this.panel = $ get (myElement), а затем мое частичное обновление страницы уничтожает узел, который был возвращен this.panel при первоначальном создании объекта, this.panel станет неопределенным. Используйте геттер.

Надеюсь, это поможет - счастливое кодирование.

EDIT:

На самом деле - теперь, когда я снова посмотрю, вы, вероятно, захотите использовать геттеры для всех ваших свойств, вместо того чтобы полагаться на get_panel (). Find (..) для currentView, например, я бы сделал другое получатель там:

get_currentView: function () {return $ get ("Hidden_CurrentView", this.get_panel ()); }

B

...