如何停止在knockout js中计算函数的observable?

时间:2014-01-28 05:18:43

标签: knockout.js

我是KnocoutJs的新手。任何帮助深表感谢。 我想在点击div时调用函数,并且应该在计算函数内调用相同的函数。以下是我的功能。

DetailViewModel.prototype.DisplayChange = function (name) {
    this.currentSelection(name);
    switch (this.currentSelection()) {
    case "abc":
        {
            this.abc();
            break;
        }
    case "xyz":
        {
            this.showxyz();
            break;
        }
    }
};

我在点击.cshtml文件和计算机内部函数时调用此函数。

<div class ="TestTabs" data-bind="foreach: availableTabs">
  <div class="Tab-ListItem" 
      data-bind="text: $data, click: $parent.DisplayChange.bind($parent), 
           css : {tabSelected : $parent.currentSelection() == $data}">
  </div>
</div>

我的计算:

this.selectedData = ko.computed(function () {
    return _this.compselectedData();
});

public compselectedData(): {
    this.DisplayChange(this.currentSelection())
}

即使我在点击时调用DisplayChange(),它也会在compselectedData()内部触发。 如何停止点击计算功能?

1 个答案:

答案 0 :(得分:1)

你有一个无限循环:

  • 如果计算的selectedData将始终重新评估 currentSelection被修改。
  • 在计算的内容中修改currentSelection。

为了打破循环,我建议如下:

在click事件上,更改currentSelection observable而不是调用DisplayChange函数:

<div class ="TestTabs" data-bind="foreach: availableTabs">
  <div class="Tab-ListItem" 
      data-bind="text: $data, click: $parent.currentSelection($data), 
           css : {tabSelected : $parent.currentSelection() == $data}">
  </div>
</div>

不要更改DisplayChange函数中的observable:

DetailViewModel.prototype.DisplayChange = function (name) {
    switch (this.currentSelection()) {
    case "abc":
        {
            this.abc();
            break;
        }
    case "xyz":
        {
            this.showxyz();
            break;
        }
    }
};

这就是淘汰赛之美,你只改变模型,视图会自动更新。