【问题标题】:Initialize subscriptions to ko.subscribable at module creation在模块创建时初始化对 ko.subscribable 的订阅
【发布时间】:2016-07-06 12:50:04
【问题描述】:

我有使用显示模块模式实现的 ViewModel。我正在使用可订阅的全局淘汰赛来实现这些数据之间的解耦传递。我现在正在做的是,在 master-ViewModel 中创建一个 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 时初始化订阅?这样我就可以避免公共初始化函数。

【问题讨论】:

  • ViewModel构造函数执行的时候不能只执行initSubscription吗?

标签: javascript knockout.js publish-subscribe revealing-module-pattern


【解决方案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
    }
}

【讨论】:

  • 我试过了,但是没有用。因为this,在调用订阅函数时,并没有引用ViewModel。顺便说一句,我现在正在使用邮箱扩展,但结果相同。我将编辑我的帖子。
  • 我已经使用var self = this; 成语调整了this 问题的答案。
猜你喜欢
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多