【问题标题】:Overload subscription on observable对 observable 进行重载订阅
【发布时间】:2014-06-17 08:30:10
【问题描述】:

是否可以在可观察对象上重载预先存在的订阅?如果可以,如何实现?

this.myObservable = ko.observable();
this.myObservable.subscribe(function(value){
    /* stuff worth subscribing for */
});
/* stuff going on */
/* ... */
/* more stuff going on */

// now at this point I want to check if something has subscribed to
// this.myObservable and if so I want the subscription to do a bit extra

我知道我可以首先在初始订阅中放置“位额外”,但我想知道是否可以检查订阅然后重载它。

【问题讨论】:

    标签: knockout.js subscription observable


    【解决方案1】:

    我确信有一种神奇的 JavaScript 方法可以做到这一点,但在阅读本文时出于某种原因突然想到的一种方法(不是那么花哨,请注意)是这样的 -

    function doSomething() { alert('Hey'); }
    function doSomethingElse() { alert('Hey2'); }
    
    ko.extenders.functionAdder = function (target, firstFunc) {
        target.functionBag = target.functionBag ? target.functionBag : [];
        target.functionBag.push(firstFunc);
        target.subscribe(function(value){
            ko.utils.arrayForEach(target.functionBag, function (item) {
                item();
            }); 
        });
    }    
    self.things = ko.observableArray([new Message('Hey')]).extend({ functionAdder: doSomething });
    
    // Later on
    
    target.functionBag.push(doSomethingElse);
    

    示例 -

    http://jsfiddle.net/k94qT/

    可能有更合适的方法来重新打开函数并向其添加内容,但这听起来像 Ember.js 的重新打开类,我不知道在 Knockout.js 中有类似的东西

    【讨论】:

    • 要么直接回答问题,要么不回答,我喜欢这个。 +1
    • 只是好奇......这个解决方案和简单订阅两次有什么区别?
    • 只有一个订阅需要处理,您可以按需添加和删除操作,它非常酷。
    【解决方案2】:

    Knockout 不提供任何延长订阅的方式。但是您可以包装 subscribe 方法来提供一种方法。这是一个例子:

    ko.subscribable.fn.subscribe = (function (originalFunction) {
        return function (callback, callbackTarget, event) {
            var boundCallback = callbackTarget ? callback.bind(callbackTarget) : callback,
                currentCallback = boundCallback,
                passthroughCallback = function (value) { currentCallback(value) },
                subscription = originalFunction.call(this, passthroughCallback, null, event);
    
            subscription.extend = function (newCallback) {
                currentCallback = newCallback.bind(null, currentCallback);
            };
            return subscription;
        }
    })(ko.subscribable.fn.subscribe);
    

    http://jsfiddle.net/mbest/LKrr9/

    您还提到以后能够从 observable 中检索订阅。您可以通过在上面的函数中添加一行来实现这一点,如下所示:

    this.latestSubscription = subscription;
    

    这假设订阅不会被释放。如果你想获得最新的未处置订阅,那就有点复杂了。

    注意:上述扩展subscribe 的方法仅适用于 Knockout >=3.1.0。对于以前的版本,您必须在扩展程序中附加新的 subscribe 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 2022-07-28
      相关资源
      最近更新 更多