【问题标题】:Extend an entity to create a computed observable that requires a navigation property扩展实体以创建需要导航属性的计算可观察对象
【发布时间】:2012-11-29 01:32:17
【问题描述】:

我正在尝试扩展一个实体以创建一个需要导航属性的计算 observable:

app.domain.indicador = function () {
    this.ValorMetaActual = ko.computed({
        read: function () {
            console.log(this.ValoresMeta); //navigation property: undefined
            return 0;
        },
        deferEvaluation: true
    }, this);
};

问题是当observable被创建时,导航属性还不存在。

我能做些什么来解决这个问题?

【问题讨论】:

  • “indicador”是 entityType 构造函数吗?您是否考虑过注册一个初始化程序来定义计算?依赖导航属性将在您的初始化程序被调用时定义。
  • indicador 是一个实体类型,是的。我正在扩展实体,如下所述:breezejs.com/documentation/extending-entities(部分:添加敲除计算)并在元数据存储中注册(store.registerEntityTypeCtor("Indicador", app.domain.indicador);)。我有其他扩展实体可以很好地处理普通属性。这是我第一次尝试在计算的 observable 中使用导航属性。如果相关,变量 ValoresMeta 是一个集合。明天我可以提供更多代码(这里是晚上 9:46 :))
  • 您在 Breeze KO 模型库中发现了一个细微的错误。我们正在修复它。感谢您找到它。同时,如果它在初始化程序中,您的逻辑应该可以工作。或者至少它在我模拟你的例子中有效。当我们为构造函数解决问题时,我们会在这里通知您。
  • 这很简单 :) 请参阅下面 Jay 对 v.0.76.3 中的修复的评论

标签: knockout.js breeze


【解决方案1】:

这是一个错误,已在 v 0.76.3 中修复。如果这能解决您的问题,请告诉我们。 ...感谢您找到它。

【讨论】:

    【解决方案2】:

    我假设问题是您的计算值显示在页面上的某处 - 并且显示为未定义。如果您将导航属性 (this.ValoresMeta) 设为 observable,那么 Knockout 将在最终分配 ValoresMeta 时更新 ValorMetaActual 的显示值。

    app.domain.indicador = function () {
        this.ValoresMeta = ko.observable(0);
        this.ValorMetaActual = ko.computed({
            read: function () {
                console.log(this.ValoresMeta());
                return 0;
            },
            deferEvaluation: true
        }, this);
    };
    

    以上代码将0 指定为ValoresMeta 的默认值。您可能需要一些其他默认值,但您应该有一些默认值,这样您的计算就不会以未定义的形式结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-20
      • 2014-04-12
      • 2020-06-03
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      相关资源
      最近更新 更多