我需要在淘汰赛中暂停订阅。 原因是,在观察到更改之后,有时需要更改其值,并且在订阅时它最终会以递归形式发送。
我发现了以下内容 SuspendableSubscription
但我真的不知道如何使用它。
我的代码是
this.SearchParam.ProjectTypes.suspendableSubscribe(changeProjectType);
//....
function changeProjectType() {
// my changes on this.SearchParam.ProjectTypes observable
}
但是如何暂停订阅以防止递归调用 changeProjectType ?
或许我使用错误的工具来完成工作,还有更好的选择吗?
由于
答案 0 :(得分:1)
像这样的递归问题我通常将其视为"代码气味"。这强烈暗示你做这件事的方式可能是错误的做法。
抛开这一点并假设方法是正确的,一种避免递归调用的简单方法是添加一个标志来阻止它发生:
http://jsfiddle.net/Quango/ea6cqq5n/
这是一个简单的表单和viewModel,用于修剪输入并转换为大写。它有一个nameEditing
标志:当设置为true时,我们处于subscribe事件中,因此我们忽略任何递归订阅事件。
// flag to prevent recursion
self.nameEditing = false;
在订阅中,我们首先检查此标志,如果未设置,我们会在进行更改前设置,并在完成更改时取消设置。
self.Name.subscribe(function (newName) {
if (!self.nameEditing) {
// prevent recursion
self.nameEditing = true;
// change the observable
if (newName) {
// clean up value
self.Name(newName.trim().toUpperCase());
}
self.nameEditing = false;
}
});
希望这有帮助。