淘汰赛中的暂停订阅
Suspendable subscription in knockout
我需要在淘汰赛中暂停订阅。
原因是,在一个 observable 改变后,有时需要改变它的值,而订阅它最终会递归。
我找到了以下内容
SuspendableSubscription
但是我真的不知道怎么用
我的密码是
this.SearchParam.ProjectTypes.suspendableSubscribe(changeProjectType);
//....
function changeProjectType() {
// my changes on this.SearchParam.ProjectTypes observable
}
但是如何暂停订阅以防止递归调用 changeProjectType?
或者我可能使用了错误的工具,还有更好的选择?
谢谢
像这样的递归问题我通常将其视为 "code smell"。强烈建议您这样做的方式可能是错误的方法。
撇开这个不谈,假设方法是正确的,避免递归调用的一个简单方法是添加一个标志来阻止它发生:
http://jsfiddle.net/Quango/ea6cqq5n/
这是一个简单的表单和 viewModel,trim 输入并转换为大写。它有一个 nameEditing
标志:当设置为 true 时,我们处于订阅事件中,因此我们忽略任何递归订阅事件。
// 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;
}
});
希望这对您有所帮助。
我需要在淘汰赛中暂停订阅。 原因是,在一个 observable 改变后,有时需要改变它的值,而订阅它最终会递归。
我找到了以下内容 SuspendableSubscription
但是我真的不知道怎么用
我的密码是
this.SearchParam.ProjectTypes.suspendableSubscribe(changeProjectType);
//....
function changeProjectType() {
// my changes on this.SearchParam.ProjectTypes observable
}
但是如何暂停订阅以防止递归调用 changeProjectType?
或者我可能使用了错误的工具,还有更好的选择?
谢谢
像这样的递归问题我通常将其视为 "code smell"。强烈建议您这样做的方式可能是错误的方法。
撇开这个不谈,假设方法是正确的,避免递归调用的一个简单方法是添加一个标志来阻止它发生:
http://jsfiddle.net/Quango/ea6cqq5n/
这是一个简单的表单和 viewModel,trim 输入并转换为大写。它有一个 nameEditing
标志:当设置为 true 时,我们处于订阅事件中,因此我们忽略任何递归订阅事件。
// 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;
}
});
希望这对您有所帮助。