如何创建只能触发一次的knockout observable订阅?

kyr*_*isu 6 javascript knockout.js

在我的模型中,我有一个异步加载的属性.我希望它在加载后生成另一个模型属性.

我正在考虑在第一个属性更改后可能触发的订阅,生成第二个属性然后处理 - 我不知道如何从内部处理订阅.

有没有办法在可观察的财产变化后解雇一次事件?

bla*_*icz 24

要从内部处理订阅,只需创建对它的引用:

var subscription = yourObservable.subscribe(function (newValue) {
    ...
    subsription.dispose();
});
Run Code Online (Sandbox Code Playgroud)

如果您不想每次都编写此代码,可以使用新方法扩展observable:

ko.subscribable.fn.subscribeOnce = function (handler, owner, eventName) {
    var subscription = this.subscribe(function (newValue) {
        subscription.dispose();
        handler(newValue);
    }, owner, eventName);
    return subscription;
};

...

// usage
var subscription = yourObservable.subsribeOnce(yourHandler);
Run Code Online (Sandbox Code Playgroud)

并且不要忘记在未被解雇的情况下处理组件处理的订阅.


spe*_*der 0

您可以编写一个扩展器来抑制除第一次触发之外的所有触发:

ko.extenders.fireOnce= function(target) {
    var fired=false;
    var result = ko.computed({
        read: target,
        write: function(newValue) {
            var current = target();
            if (newValue!== current && !fired) {
                fired=true;
                target(newValue);
            }
        }
    });
    result(target());
    return result;
};
Run Code Online (Sandbox Code Playgroud)

然后按如下方式使用它:

var myObservable = ko.Observable(blah).extend({fireOnce:null});
Run Code Online (Sandbox Code Playgroud)

  • 是的,因为问题是关于订阅的,所以会触发一次,并且您建议了一个_更改一次_的可观察值。这是两个截然不同的事情。 (2认同)