Инициализировать подписки на ko.subscribable при создании модуля

У меня есть ViewModels, которые реализованы с использованием шаблона раскрывающегося модуля. Я использую глобальную подписку на нокаут для обеспечения несвязанной передачи данных между ними. Что я делаю сейчас, так это создание экземпляра ViewModel в master-ViewModel:

NameSpace.MasterViewModel = function(){
    var viewModel = new viewModel(),
        initSubscription = function(){
            viewModel.initSubscription();
        };

    return {
        initSubscription: initSubscription
    }
}

И инициализирует подписку в ViewModel следующим образом:

NameSpace.ViewModel = function(){
    var data,
        initSubscription = function(){
            ko.postbox.subscribe( "New Data"function(newData){
                this.data = newData;
            }, this);
        };

    return {
        data: data,
        initSubscription: initSubscription
    }
}

Это работает, но я хочу знать, есть ли способ инициализировать подписку при создании ViewModel? Так что я могу избежать публичной функции инициализации.


person robbannn    schedule 19.03.2016    source источник
comment
Разве вы не можете просто выполнить initSubscription, когда выполняется функция конструктора ViewModel?   -  person Jeroen    schedule 20.03.2016


Ответы (1)


есть ли способ инициализировать подписку при создании ViewModel?

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

NameSpace.ViewModel = function(){
    var data;
    var self = this;
    var initSubscription = function(){
            NameSpace.Postbox.subscribe(function(newData){
                self.data = newData;
            }, this, "New Data");
        };

    initSubscription(); // <-- does exactly what you ask

    return {
        data: data,
        initSubscription: initSubscription  // <-- might be superfluous now
    }
}
person Jeroen    schedule 21.03.2016
comment
Я попробовал это, но это не сработало. Потому что this при вызове функции подписки не ссылается на ViewModel. Кстати, сейчас я использую расширение почтового ящика, результат тот же. Я отредактирую свой пост. - person robbannn; 22.03.2016
comment
Я скорректировал свой ответ для задачи this, используя идиому var self = this;. - person Jeroen; 22.03.2016