如何在计算回调函数中立即修改knockout.js observable?

时间:2014-01-17 18:18:39

标签: knockout.js

我正在使用knockout.js 3.0而且我有一些简单的结论:

 var self = this;
 self.selectedItem = ko.observable("default text");
 ko.computed(function () {
    if (this.selectedItem() != "default text") {
       this.selectedItem("success");
    }
 }, self);

但是当我改变我的observable时,计算出的回调函数再次触发。那么如何预先呢?

3 个答案:

答案 0 :(得分:1)

通常,您为计算函数指定变量名称,以便可以从视图中的某个位置引用它。计算也不是“回调”,这完全不同,尽管我认为计算可以用作回调函数。一个ko计算的observable通常是一个可观察的,你想对其他可观察的变化作出反应,尽管它还有许多其他的用途。

var self = this;
self.selectedItem = ko.observable("default text");
self.testTextChange = ko.computed(function () {
    if (self.selectedItem() != "default text") {
       alert("success"); // Changed this to alert, otherwise, you will change the value of the input as you stated in your question.
    }
});

然后在你看来,像

<input data-bind="text: selectedItem" />
<button data-bind="click: testTextChange">Click Me</button>

这是一个完全随意的例子,它提出了几个问题,你对data-bind的观点有什么看法,你究竟想要做些什么呢?

答案 1 :(得分:1)

您可以像这样使用可写的计算可观察量:

var self = this;
self.selectedItem = ko.observable("default text");
self.notifySelectedItem = ko.computed({
  read: self.selectedItem,
  write: function (value) {
    if (this.selectedItem() != "default text") {
      self.selectedItem(value);
      alert("success");
    }
  }
});

使用 notifySelectedItem 代替 selectedItem ,无论您何时需要获得有关更改的通知。它将显示selectedItem值,并在更新时调用write回调。您可能需要根据需要将self.selectedItem(value)移到if块之外。

答案 2 :(得分:-1)

您似乎对如何使用计算的observable感到困惑,因为您根本没有将observable保存在self的属性上。

在任何情况下,当你合并时,你会做两件会导致问题的事情:

  1. 使计算取决于可观察的selectedItem
  2. 让计算出的更新 selectedItem
  3. 这将(或者至少:可能)导致无限循环,因为每次基础可观察量发生变化时都会重新计算计算值,但它会改变该观察值本身。

    即使你可以,在计算的observable中更新(可观察的)变量也是不明智的,至少在read(又称“getter”)版本中是这样。

    PS。您可能正在寻找writable computed observables