6

私のモデルには、非同期で読み込まれるプロパティがあります。ロード後に別のモデルプロパティを生成したいと思います。

1番目のプロパティが変更された後に起動し、2番目のプロパティを生成してから破棄できるサブスクリプションについて考えていました。サブスクリプションを、それ自体の内部から破棄するにはどうすればよいかわかりません。

観察可能なプロパティの変更後に1回限りのイベントを発生させる方法はありますか?

4

4 に答える 4

26

サブスクリプションをそれ自体の内部から破棄するには、サブスクリプションへの参照を作成するだけです。

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

また、解雇されなかった場合に備えて、コンポーネントの廃棄に関するサブスクリプションを破棄することを忘れないでください。

于 2014-10-08T08:43:22.157 に答える
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;
};

次に、次のように使用します。

var myObservable = ko.Observable(blah).extend({fireOnce:null});
于 2012-12-04T11:26:37.017 に答える
0

私たちはこのような解決策に行き着きました...

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

誰かがそれを使用できることを願っています。

于 2016-09-20T09:11:04.650 に答える
0

@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) {
    ...
});
于 2016-11-29T06:09:58.950 に答える