在淘汰赛中......你必须做这样的事情:
function Xxx(val)
{
var self = this;
this.x = ko.observable(val);
this.change = function() {
// "that" may be different to "self" in some
// cases...
var that = this;
$.ajax({
url: '...',
type: 'get',
success: function(data) {
self.x(5);
},
error: function(a) {
console.log('got an error');
}
});
};
}
var newX = new Xxx(1);
newX.change();
ko.computed(function () {
// This will get called everytime
// newX.x is changed
console.log(newX.x());
});
当您创建一个可能会改变的变量时,您必须将其创建为可观察的。observable 实际上是您调用的函数。当被调用时,它将更新其内部值,并且它还将在可观察对象被“观察到”的任何地方触发任何更改
你绝不应该尝试去做this.x = 5
。它将覆盖实际的可观察对象,因此它永远不会触发每个观察者的变化。
编辑
如果您有兴趣了解计算的工作原理。计算变量是一个listen
可以观察到的函数。当它computed
被创建时,它会被调用一次以检查从它内部调用了哪些 observables。这是一种“跟踪”依赖关系的方法。在此示例中,您应该看到至少两个控制台日志。一个加 1,然后加 5。
就我而言,计算变量是一种匿名的,因为它在任何地方都不会受到影响。同样在某些情况下,您可能需要观察一个变量但使用多个可观察对象。防止更新任何其他使用的 observables。有一些方法可以做到这一点。您可以在“观看”所需的 observables 后返回。
或者您可以创建一个子函数,该函数将在用 计算后触发一点setTimeout(..., 0);
。有几种方法可以实现一些非常好的技巧。