我正在使用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时,计算出的回调函数再次触发。那么如何预先呢?
答案 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
的属性上。
在任何情况下,当你合并时,你会做两件会导致问题的事情:
selectedItem
selectedItem
这将(或者至少:可能)导致无限循环,因为每次基础可观察量发生变化时都会重新计算计算值,但它会改变该观察值本身。
即使你可以,在计算的observable中更新(可观察的)变量也是不明智的,至少在read
(又称“getter”)版本中是这样。
PS。您可能正在寻找writable computed observables。