私のモデルには、非同期で読み込まれるプロパティがあります。ロード後に別のモデルプロパティを生成したいと思います。
1番目のプロパティが変更された後に起動し、2番目のプロパティを生成してから破棄できるサブスクリプションについて考えていました。サブスクリプションを、それ自体の内部から破棄するにはどうすればよいかわかりません。
観察可能なプロパティの変更後に1回限りのイベントを発生させる方法はありますか?
私のモデルには、非同期で読み込まれるプロパティがあります。ロード後に別のモデルプロパティを生成したいと思います。
1番目のプロパティが変更された後に起動し、2番目のプロパティを生成してから破棄できるサブスクリプションについて考えていました。サブスクリプションを、それ自体の内部から破棄するにはどうすればよいかわかりません。
観察可能なプロパティの変更後に1回限りのイベントを発生させる方法はありますか?
サブスクリプションをそれ自体の内部から破棄するには、サブスクリプションへの参照を作成するだけです。
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) {
...
});