KnockoutJS,使用subscribable。 callbackTarget

时间:2013-10-21 14:53:03

标签: javascript knockout.js publish-subscribe

我想在我的应用程序中实现一个简单的pub-sub,因此KO可订阅似乎很有希望。

我有以下代码。

var announcer = new ko.subscribable();

var s1 = announcer.subscribe(function(val){
    console.log('subscriber1: ' + val);
}, null, 'news');

var s2 = announcer.subscribe(function(val){
    console.log('subscriber2: ' + val);
}, null, 'gossip');

var s3 = announcer.subscribe(function(val){
    console.log('subscriber3: ' + val);
}, null, 'news');

发布"新闻"信道

announcer.notifySubscribers('good news', 'news')

/* Outputs: */

subscriber1: good news
subscriber3: good news 

发布在"八卦"信道

announcer.notifySubscribers('hipster news', 'gossip')

/* Outputs: */

subscriber2: hipster news 

到目前为止,似乎有效......

我的问题是:

subscribable.subscribe期望的第二个参数是什么?

Knockout网站从不谈论它,所以我去了代码并发现了这个:

subscribe: function (callback, callbackTarget, event) {
    event = event || defaultEvent;
    var boundCallback = callbackTarget ? callback.bind(callbackTarget) : callback;

var subscription = new ko.subscription(this, boundCallback, function () {
        ko.utils.arrayRemoveItem(this._subscriptions[event], subscription);
    }.bind(this));

很明显,我的pub / sub实现是有效的,因为我没有传递callbackTarget,所以改为使用 callback

奖金问题:

我们何时应该使用 callbackTarget

任何人都可以提供其使用示例吗?

2 个答案:

答案 0 :(得分:2)

订阅功能的第二个参数用于设置this的上下文。如果不想在回调函数中使用this,则可以传递null。

答案 1 :(得分:1)

不要把我的话当作庄严,因为我从未使用过这种能力,但我相信无论如何我都可以回答你的问题......

callbackTarget是您要绑定到的上下文,因此如果您从viewmodel外部订阅,您仍然可以通过传入它来绑定到该上下文 -

我们什么时候应该使用callbackTarget?

当您绑定到该上下文之外的上下文时 - 即,当您有多个视图模型时绑定到viewmodel的上下文。

任何人都可以提供其使用示例吗?

示例来自 - http://www.knockmeout.net/2012/05/using-ko-native-pubsub.html

postbox.subscribe(callback, target, topic);

postbox.subscribe(function(newValue) {
    this.latestTopic(newValue);
}, vm, "mytopic");

如果函数是回调函数,则callbackTarget为'vm',主题为'mytopic'