Knockout - 添加了observable而不是更新新对象

时间:2013-10-07 15:34:25

标签: javascript knockout.js breeze

出于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不会更新新对象?

1 个答案:

答案 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;

这将确保在派对绑定到父节点并在视图中显示之前,将设置所有属性。然后,当您设置导航属性时,它将在您的视图中显示为非常喜欢。