を変更するときに呼び出されないサブスクライブこのコードを取る:ノックアウトは、観察可能な配列
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>
私は2つの質問を持っている...
- をするとき、私
self.isValid
、呼び出されないのはなぜこれを行うvm.data()[0].valid = false;
? - 最初にisValidがtrueで、その後falseに設定されたときにサブスクライブ(
alert("Subscribe called!");
)が呼び出されないのはなぜですか?これは私のコードで2回呼び出されると思います。
おかげ
ありがとうございました! ...よく私はフィドルの代わりにスタックスニペットを使用するように言われました...だから、通常、私はフィドルを "答え"の新しいフィドルリンクをポストして更新するでしょう...しかし、私はどのようにコードを更新することができません疑問にそれをしないで? – MojoDK
@MojoDK:できません。それをやむを得ない場合、最善の策は、最初の発言の下に2番目のスニペットを置くことです。「私はXの答えに何かしようとしましたが、まだ動作していません。 (そして、必要なものをカバーする答えが出たら、もう一度それを取り除くことができます。)それを実行して、すでに存在している問題(質問は移動することを目的としたものではありません)に制限することが重要です。この場合、彼らはそうだったので、それはうまくいったでしょう。喜んで助けた! –