계산 된 관찰 가능 함수에서 관찰 가능 항목의 순서로 인해 업데이트되지 않는 계산 된 관찰 가능 항목이 있습니다. 분기를 클릭하면 리프에 계산 된 관찰 가능 항목이 업데이트되지 않습니다. 이것은 의도 된 것입니까?knockoutjs : 계산 된 사항을 순서대로 관찰 할 수 있습니까?
https://jsfiddle.net/acL3f1qp/9/
자바 스크립트 :
(function() {
function Branch(viewModel) {
var self = this;
self.isAllowed;
self.isChecked = ko.observable();
self.isChecked.subscribe(function(newValue){
//is updating?
null;
});
self.leaves = [];
self.allowLeaves = ko.computed(function() {
return viewModel.allowLeaves() && (!self.isAllowed || self.isChecked());
});
}
function Leaf(branch) {
var self = this;
var isCheckedInternal = ko.observable();
self.isAllowed;
self.isChecked = ko.computed({
read: function() {
return branch.allowLeaves() && isCheckedInternal();
},
write: function(value) {
isCheckedInternal(value);
}
});
}
function ViewModel() {
var self = this;
var branch;
var leaf;
self.allowLeaves = ko.observable(true);
self.branches = [];
branch = new Branch(self);
branch.isAllowed = true;
branch.isChecked(true);
leaf = new Leaf(branch);
leaf.isAllowed = true;
leaf.isChecked(true);
branch.leaves.push(leaf);
self.branches.push(branch);
}
ko.applyBindings(new ViewModel());
})();
HTML :
<div>
<label>
<input type="checkbox" data-bind="checked: allowLeaves" />
<span>allow leaves</span>
</label>
</div>
<div class="indent" data-bind="foreach: branches">
<div>
<label>
<input type="checkbox" data-bind="checked: isChecked, visible: isAllowed" />
<span>branch</span>
</label>
</div>
<div class="indent" data-bind="foreach: leaves">
<div>
<label>
<input type="checkbox" data-bind="checked: isChecked, visible: isAllowed" />
<span>leaf</span>
</label>
</div>
</div>
</div>
<br />
clicking on "branch" does
가 잎에 계산 업데이트하지!
귀하의 selfs는 뷰 모델의 다른 부분에 관한되어 있습니다. – brianlmerritt
몇 가지 추가 설명. - 배열 중 일부 ('branches','leaves')가 * observable * 배열이 아니어야합니까? - 'isCheckedInternal' var은 관찰 할 수 없으므로 변경하면 계산 된 업데이트가 실행되지 않으므로, 적어도이 repro에는 무엇이 있습니까? - Leaf'isChecked'는 계산 된 readonly *이지만 뷰에는 양방향 바인딩이 있습니까? – Jeroen
여하튼, 뷰 모델을 계산할 때 계산 된 함수는 * once * 실행되어 다른 관측 값이 해당 값에 대해 호출 될 때 모든 종속성을 설정합니다.논리 연산자와 초기 리턴 문이 단락되어 초기 실행이 종속성을 올바르게 설정하지 못할 수 있습니다. 관찰 가능한 getter를 재정렬하십시오 (예 : 계산 함수의 시작 부분에서 간단히 호출하여 로컬 변수에 값을 저장하는 것으로 시작). 문제인지 확인하십시오. – Jeroen