出于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);
});
“派对”在页面开始时定义为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,它将自己添加到Parties observableArray中,因为它与同一个父对象相关。然后我可以再次调用updateAgreed以使用适当的值填充Agreed observable。
逻辑上,这项工作符合预期 - 您可以单步执行它并观察新项目的同意可观察性,并添加并填充预期值。问题出现在UI中 - 它不会更新为已更改。然而,对已经加载的对象运行相同的代码会导致UI更新。
我很难过。我无法在Fiddle中复制它,因为我们在Breeze中创建对象而不是动态 - 并且制作没有Breeze的模拟版本可以完美地工作。为什么我的observable会更新已加载的对象,但是同一个observable不会更新新对象?
答案 0 :(得分:2)
我认为有一些事情需要解决。一,既然你正在使用Breeze,那就利用模型构造函数和初始化器。无论您为模型定义属性,请添加以下代码 -
metadataStore.registerEntityTypeCtor(
'Party', null, partyinitializer);
function partyinitializer(party) {
party.Agreed = ko.observable(false);
}
现在,您所有的派对实体都拥有您可以访问的协议属性。接下来,确保您没有在createEntity方法中设置Party的父导航属性,因为这将破坏您的绑定。
var lp = manager.createEntity('Party'. { [an array of initial values] });
lp.parentParty(something); // Set the parent here
return lp;
这将确保在派对绑定到父节点并在视图中显示之前,将设置所有属性。然后,当您设置导航属性时,它将在您的视图中显示为非常喜欢。