【发布时间】:2013-10-14 06:18:32
【问题描述】:
出于 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 observable。
从逻辑上讲,这项工作按预期工作 - 您可以逐步完成它并观察添加新项目的 Agreed observable 并填充预期值。问题出现在 UI 中 - 它不会随着更改而更新。然而,对已加载的对象运行相同的代码确实会导致 UI 更新。
我被这个难住了。我无法在 Fiddle 中复制它,因为我们在 Breeze 中创建对象而不是在运行中创建对象 - 并且制作没有 Breeze 的模拟版本非常有效。为什么我的 observable 会在已加载的对象上更新,但相同的 observable 不会在新对象上更新?
【问题讨论】:
-
所有突出显示的内容是
Agreed在处理现有项目的代码中包含一个布尔值,但在添加新项目时设置为空字符串。 -
感谢您的建议,但 Javascript 不是强类型的,所以它不应该有任何区别。而且我实际上已经尝试过了,但没有:)
标签: javascript knockout.js breeze