我有一个荒谬的时间试图使用Knockout处理地址。我的结构是这样的:
viewModel.buildings()[0].Address()...
地址是:
var Address = function () {
var self = this;
self.cAddr1 = ko.observable("");
self.cCity = ko.observable("");
...
self.cDisplay = ko.pureComputed(function () {
return self.cAddr1() + '<br>' + self.cCity() + ...;
}
self.AddressActions = new AddressActions();
}
一切似乎都运转正常。每个建筑物都有一个地址,并且可观察的信息正确更新。 cDisplay也可以正常工作。
我想添加另一个计算/可观察/ /当地址改变时将调用属于AddressActions的函数的任何东西。我试过这个,但是console.log从来没有受到打击,这对我没有任何意义:
var Address = function () {
// Same as above...
...
self.triggerAddressVerify = ko.pureComputed(function () {
console.log('here');
self.cAddr1(); self.cAddr2(); self.cCity(); self.cState(); self.cZip();
self.AddressActions.VerifyAddress(self);
}
}
为什么这不起作用的任何想法?
结果 所以我对knockout.js来说还是新手(显然),但它的工作方式与我想的有点不同。我基本上使用了接受的答案,但将所有内容都包含在pureComputed中。这是我最后添加的内容:
var Address = function () {
...
self.addressChangeEvent = ko.pureComputed(function () {
return self.cAddr1() + self.cAddr2() + self.cCity() self.cState() + self.cZip();
}
self.addressChangeEvent.subscribe(function () {
self.AddressActions.VerifyAddress(self);
}
}
答案 0 :(得分:3)
看起来您正在寻找subscribe
而不是computed
self.cAddr1.subscribe(function(){
self.AddressActions.VerifyAddress(self);
});
您可以为
所需的每个变量添加订阅答案 1 :(得分:1)
纯计算的Knockout文档明确表示当您打算执行某些操作时不使用它(side effects)。
您不应将纯特征用于计算的observable,以便在其依赖项发生更改时执行操作。
您可以使用常规计算机。
self.triggerAddressVerify = ko.computed(function () {
console.log('here');
self.cAddr1(); self.cAddr2(); self.cCity(); self.cState(); self.cZip();
self.AddressActions.VerifyAddress(self);
});
但请注意,这将在最初以及未来的更改中运行一次。如果您只想对未来的更改执行操作,那么订阅纯计算的方法会更好。