出于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,因此我们转到数据服务,该服务要求实体框架创建适当类型的新对象,然后添加一个可观察对象:
var lp = manager.createEntity('Party_dto'. { [an array of initial values] });
lp.Agreed = ko.observable('');
return lp;
多亏了Breeze,这将自身添加到了缔约方的observableArray中,因为它与同一个父对象有关。然后,我可以再次调用updateAgreed,以适当的值填充可观察的Agreed。
从逻辑上讲,这项工作是按预期进行的-您可以逐步执行此过程,并观看将添加的新项目的“商定”观察值与预期值一起填充的情况。问题出在UI中-不会随着更改而更新。但是,对已经加载的对象运行相同的代码确实会导致UI更新。
我为此感到难过。我无法在Fiddle中复制它,因为我们是在Breeze中创建对象的,而不是即时创建的-并且在没有Breeze的情况下制作模拟版本的效果很好。为什么我的可观察对象在已加载的对象上更新,而同一可观察对象却不在新对象上更新?
我认为有几件事需要解决。第一,因为您正在使用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;
这将确保在将聚会绑定回父对象并显示在视图中之前,将设置所有属性。然后,当您设置导航属性时,它会在您的视图中全部显示为快乐。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句