1

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

4

1 回答 1

2

我认为有一些事情需要解决。一,由于您使用的是 Breeze,因此请利用模型构造函数和初始化程序。无论您在何处为模型定义属性,请添加以下代码 -

metadataStore.registerEntityTypeCtor(
    'Party', null, partyinitializer);

function partyinitializer(party) {
    party.Agreed = ko.observable(false);
}

现在,您的所有派对实体都有一个您可以访问的商定财产。接下来,确保您没有在 createEntity 方法中设置派对的父导航属性,因为这会破坏您的绑定。

var lp = manager.createEntity('Party'. { [an array of initial values] });
lp.parentParty(something); // Set the parent here
return lp;

这将确保在该方绑定回父级并显示在视图中之前,将设置所有属性。然后,当您设置导航属性时,它将在您的视图中显示出来。

于 2013-10-07T23:17:46.930 回答