【问题标题】:KnockoutJS, using subscribable. callbackTargetKnockoutJS,使用可订阅的。回调目标
【发布时间】:2013-10-21 14:53:02
【问题描述】:

我想在我的应用程序中实现一个简单的 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

谁能提供其用法示例?

【问题讨论】:

标签: javascript knockout.js publish-subscribe


【解决方案1】:

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

【讨论】:

  • 但是如果设置了callbackTarget,那么ko会执行:callback.bind(callbackTarget)... 那不会失败吗?我不知道任何作为函数原型的“绑定”方法
  • 不,不会。在 bind 内部,它将使用 js apply\call 函数调用您的回调。
【解决方案2】:

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

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'

【讨论】:

  • 谢谢,之前上过knockmeout的文章,但是我很困惑,因为我不知道bind()在Function原型里,所以我以为你需要一些特殊的对象来代替一个简单的函数。
猜你喜欢
  • 2012-11-15
  • 2012-08-12
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 2017-08-02
  • 2015-04-21
  • 2019-03-19
  • 1970-01-01
相关资源
最近更新 更多