3

我想在我的应用程序中实现一个简单的 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,所以使用了回调

奖励问题:

我们什么时候应该使用callbackTarget

任何人都可以提供它的用法示例吗?

4

2 回答 2

2

subscribe 函数的第二个参数用于设置this. 如果不想使用this内部回调函数,您可以传递 null。

于 2013-10-21T15:00:27.613 回答
1

不要把我的话当真,因为我从来没有使用过这个能力,但我相信无论如何我都能回答你的问题......

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

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

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

任何人都可以提供它的用法示例吗?

示例来自 - 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");

其中function是callback,callbackTarget是'vm',topic是'mytopic'

于 2013-10-21T15:01:45.463 回答