淘汰赛中的暂停订阅

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

希望这对您有所帮助。