把這個代碼:淘汰賽認購不叫改變觀察的數組時
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回答但它仍然不起作用:」或類似的東西時加上第二個片段。 (然後一旦有必要的答案,你可以再次刪除它。)這樣做很重要,以限制它已經存在的問題(問題並不意味着移動目標)。在這種情況下,他們是,所以它會沒事的。很高興幫助! –