【问题标题】:Suspendable subscription in knockout淘汰赛中的暂停订阅
【发布时间】:2015-03-27 08:40:58
【问题描述】:

我需要在淘汰赛中暂停订阅。 原因是,在 observable 发生变化后,有时需要改变它的值,并且订阅它最终会以递归方式结束。

我发现了以下内容 SuspendableSubscription

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

我的代码是

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

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

或者也许我在工作中使用了错误的工具,但有更好的选择?

谢谢

【问题讨论】:

标签: knockout.js subscription observable


【解决方案1】:

像这样的递归问题我通常会将其视为“代码异味”。强烈建议您这样做的方式可能是错误的方法。

抛开这一点并假设该方法是正确的,避免递归调用的一种简单方法是添加一个标志来阻止它发生:

http://jsfiddle.net/Quango/ea6cqq5n/

这是一个简单的表单和视图模型,可以修剪输入并转换为大写。它有一个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 是一个数组,在可能的选择中有一个值 - All。选择该选项后,必须删除所有其他值。如果选择了“常规”值,则代码应检查并删除 All 值。这会导致递归
  • 代码可以总是以不同的方式设计!在没有更多上下文的情况下提出建议很棘手,但您可能需要考虑一个 .computed 值,该值根据 observableArray 值确定结果。
猜你喜欢
  • 1970-01-01
  • 2012-09-20
  • 2016-02-29
  • 2015-01-04
  • 2012-10-09
  • 2012-05-26
  • 1970-01-01
  • 2015-01-29
  • 2018-07-21
相关资源
最近更新 更多