把这个代码:淘汰赛认购不叫改变观察的数组时
var koEvents = new ko.subscribable();
var viewModel = function() {
var self = this;
self.data = ko.observableArray([{
valid: true
}, {
valid: true
}]);
self.isValid = ko.computed(function() {
var isValid = true;
ko.utils.arrayForEach(self.data(), function(item) {
console.log(item.valid);
if (!item.valid) {
isValid = false;
return;
};
});
return isValid;
}, this).subscribe(function(newValue) {
alert("Subscribe called!");
koEvents.notifySubscribers(newValue, "dataChanged");
}.bind(this));
return {
data: self.data,
isValid: self.isValid,
};
}
var vm = new viewModel();
ko.applyBindings(vm, document.getElementById("container"));
vm.data()[0].valid = false;
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="container">
<div data-bind="text: isValid ? 'valid': 'invalid'">
</div>
</div>
我有两个问题...
- 为什么
self.isValid
不叫,当我做这个vm.data()[0].valid = false;
? - 为什么订阅(
alert("Subscribe called!");
)在最初的isValid为true并且以后设置为false时未被调用?我期望在我的代码中调用两次。
感谢
谢谢! ...以及我被告知要使用Stack Snippets而不是Fiddle ...所以通常我会更新小提琴并在“答案”中提供新的小提琴链接......但是我看不到我如何更新代码没有在这个问题上做? – MojoDK
@MojoDK:你不能。当不可避免的做到这一点时,最好的办法就是在第一句话“我尝试做X回答但它仍然不起作用:”或类似的东西时加上第二个片段。 (然后一旦有必要的答案,你可以再次删除它。)这样做很重要,以限制它已经存在的问题(问题并不意味着移动目标)。在这种情况下,他们是,所以它会没事的。很高兴帮助! –