【问题标题】:Knockout - added observable not updating on new objects淘汰赛 - 添加了 observable 而不更新新对象
【发布时间】: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


【解决方案1】:

我认为有一些事情需要解决。一,由于您使用的是 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;

这将确保在派对绑定回父级并显示在视图中之前,将设置所有属性。然后,当您设置导航属性时,它会像快乐一样显示在您的视图中。

【讨论】:

  • 我又开心了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-06-02
  • 2014-08-27
  • 1970-01-01
  • 2015-05-06
  • 1970-01-01
  • 2013-04-10
  • 2013-07-06
  • 1970-01-01
相关资源
最近更新 更多