Javascript 更改可观察数组时不调用Knockout subscribe

Javascript 更改可观察数组时不调用Knockout subscribe,javascript,jquery,knockout.js,Javascript,Jquery,Knockout.js,以这个代码为例: var koEvents=new ko.subscribable(); var viewModel=函数(){ var self=这个; self.data=ko.observearray([{ 有效:正确 }, { 有效:正确 }]); self.isValid=ko.computed(函数(){ var isValid=true; ko.utils.arrayForEach(self.data(),函数(项){ console.log(item.valid); 如果(!i

以这个代码为例:

var koEvents=new ko.subscribable();
var viewModel=函数(){
var self=这个;
self.data=ko.observearray([{
有效:正确
}, {
有效:正确
}]);
self.isValid=ko.computed(函数(){
var isValid=true;
ko.utils.arrayForEach(self.data(),函数(项){
console.log(item.valid);
如果(!item.valid){
isValid=false;
返回;
};
});
返回有效;
}订阅(函数(newValue){
警报(“已呼叫订阅!”);
koEvents.notifySubscribers(newValue,“dataChanged”);
}.约束(这个);
返回{
数据:self.data,
isValid:self.isValid,
};
}
var vm=new viewModel();
applyBindings(vm,document.getElementById(“容器”);
vm.data()[0]。valid=false

该代码有几个问题,但与您所问的问题相关的主要问题是,在可观察数组中的对象上更改不可观察属性(
有效
)并不会更改可观察数组,而只是更改其中对象上的属性。所以自然没有通知。如果需要通知,则需要查看
valid
属性(这反过来意味着它必须是可观察的)

其他问题:

  • Knockout的一个问题是,它有时会为您打开观察值/计算值,但如果它们是表达式的一部分,则不会打开——您必须这样做(使用
    ()
    ):

    
    
    您的代码正在测试
    isValid
    (而不是
    isValid()
    )是否真实。它总是这样,因为它是一个函数引用

    KO仅在标识符不是表达式的一部分时为您执行自动展开。例如,这是有效的:

    
    ...
    
    但这并不是:

    
    ...
    
    (当
    有效时
    是可观察/计算的)

  • 您正在将
    self.isValid
    设置为订阅句柄,而不是计算句柄,因为您的链接过度了。:-)您需要在调用
    computed
    结束后完成分配,然后订阅:

    self.isValid = ko.computed(function() {
       // ...
    }, this); // <=== End the assignment here
    self.isValid.subscribe(function(newValue) {
       // ...
    }.bind(this));
    
    
    
    谢谢。。。我被告知要用堆栈片段代替小提琴。。。所以通常我会更新小提琴,在“答案”中发布新的小提琴链接。。。但是我看不出我怎么能不在问题中更新代码?@MojoDK:你不能。当不可避免地要这样做时,最好的办法是在第一句话下面加上第二个片段:“我已经试着按照答案X说的做了,但仍然不起作用。”或类似的话。(然后,一旦有了一个涵盖必要内容的答案,你可以再次删除它。)在这样做时,重要的是要将其限制在已经存在的问题上(问题并不意味着是移动的目标)。在这种情况下,他们是,所以这本来是好的。很高兴这有帮助!