淘汰赛中的可暂停订阅

时间:2015-01-28 12:34:22

标签: knockout.js subscription observable

我需要在淘汰赛中暂停订阅。 原因是,在观察到更改之后,有时需要更改其值,并且在订阅时它最终会以递归形式发送。

我发现了以下内容 SuspendableSubscription

但我真的不知道如何使用它。

我的代码是

this.SearchParam.ProjectTypes.suspendableSubscribe(changeProjectType);
//....
function changeProjectType() {
    // my changes on this.SearchParam.ProjectTypes observable
}

但是如何暂停订阅以防止递归调用 changeProjectType

或许我使用错误的工具来完成工作,还有更好的选择吗?

由于

1 个答案:

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

希望这有帮助。