出于 UI 的目的,当我加载数组时,我的 viewModel 是基于我根据其他一些属性向每个对象添加一个新属性:
item.forEach(function (party) {
if (party.AcknowledgementDate() === null) {
party.Agreed = ko.observable(false);
}
else {
party.Agreed = ko.observable(true);
}
vm.Parties.push(party);
});
当页面启动时,“Parties”被定义为 ko.observableArray。
此数组中的项目在单独的 UI 窗口中进行编辑。保存这些更改并关闭窗口后,我调用此函数来更新这些值:
function updateAgreed() {
vm.Parties().forEach(function (i) {
if (i.AcknowledgementDate() === null) {
i.Agreed(false);
}
else {
i.Agreed(true);
}
});
}
这一切都很好,让我很开心。当用户创建新的派对物品时,问题就来了。我们也在使用 Breeze,所以我们去请求实体框架创建一个适当类型的新对象的数据服务,然后添加一个 observable:
var lp = manager.createEntity('Party_dto'. { [an array of initial values] });
lp.Agreed = ko.observable('');
return lp;
感谢 Breeze,因为它与同一个父对象相关,所以它把自己添加到了 Party observableArray。然后我可以再次调用 updateAgreed 以使用适当的值填充 Agreed 可观察对象。
从逻辑上讲,这项工作按预期工作 - 您可以逐步完成它并观察添加新项目的 Agreed observable 并填充预期值。问题出现在 UI 中 - 它不会随着更改而更新。然而,对已加载的对象运行相同的代码确实会导致 UI 更新。
我被这件事难住了。我无法在 Fiddle 中复制它,因为我们在 Breeze 中创建对象而不是在运行中创建对象 - 并且制作没有 Breeze 的模拟版本非常有效。为什么我的 observable 会在已加载的对象上更新,但相同的 observable 不会在新对象上更新?