【发布时间】:2016-11-03 03:09:51
【问题描述】:
我有一个计算的 observable,由于计算 observable 函数中 observable 的顺序,它不会更新。单击分支不会更新叶子上的计算 observable。这是故意的吗?
https://jsfiddle.net/acL3f1qp/9/
javascript:
(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
不在叶子上计算更新!
【问题讨论】:
-
您的 self 与 viewModel 的不同部分有关,因此 self.allowBranch 在您进行测试的位置未定义。
-
一些补充说明。 - 你确定其中一些数组(
branches、leaves)不应该是observable数组吗? -isCheckedInternalvar 是不可观察的,因此更改它永远不会触发计算更新,那么它的意义何在(至少在这个重现中?)。 - LeafisChecked是一个readonly计算出来的,但是你在视图中有一个双向绑定? -
无论如何,在构建视图模型时,计算函数将运行一次,设置所有依赖项,因为其他可观察对象被调用以获取它们的值。由于短路逻辑运算符以及早期返回语句,初始运行可能无法正确设置依赖关系。尝试重新排序您的 observable getter(例如,从简单地调用它们并在计算函数开始时将它们的值保存在局部变量中)看看这是否是您的问题。
-
@brianlmerrit 你是对的,我的例子中有一个错误。我已经更新了这个例子来展示我的问题。这似乎是由于在实例化后设置了分支的属性。
-
@Jeroen 我认为逻辑操作的短路是问题的原因。谢谢!
标签: knockout.js