繁体   English   中英

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

[英]How to create knockout observable subscription that fires only once?

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

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

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

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

var subscription = yourObservable.subscribe(function (newValue) {
    ...
    subsription.dispose();
});

如果您不想每次都编写此代码,可以使用新方法扩展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);

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

你可以写一个扩展器来压制除第一次射击之外的所有射击:

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;
};

然后使用如下:

var myObservable = ko.Observable(blah).extend({fireOnce:null});

我们最终得到了这样的解决方案......

const subscription = observable.subscribe(() => {
  subscription.dispose();
  doStuff(settings);
});

希望有人可以使用它。

详细解释@blazkovicz的答案, subscribeOnce可以返回一个最终用新值解决的Promise 打开有关如何公开subscription对象的建议;-)

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

// usage
yourObservable.subscribeOnce().then(function(newValue) {
    ...
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM