Ember 计算属性在绑定到深度嵌套的属性时不会触发

Posted

技术标签:

【中文标题】Ember 计算属性在绑定到深度嵌套的属性时不会触发【英文标题】:Ember computed property doesn't fire when bound to deeply nested property 【发布时间】:2014-07-22 00:40:57 【问题描述】:

这个JSBin 隔离了我在代码中遇到的问题。我有一个嵌入式模型的层次结构和一个计算属性 (data),只要链底部的值发生变化 (symbol),它就会触发。该示例直接显示属性以及计算属性的结果。按钮在单击时更改值。您会看到它更新了属性,但计算的属性没有触发。当任何instrument.symbol 发生变化时,为什么selectedAllocation.positions.@each.instrument.symbol 不能触发计算?

如果这个例子看起来很做作,那只是因为我试图抽象出现实中更复杂的东西,例如这些数组中不止一个对象,data 是必要的,因为另一个库需要一个特定格式的简单 JS 对象。

【问题讨论】:

【参考方案1】:

请注意,@each 只能工作一层。您不能使用嵌套表单 比如 todos.@each.owner.name 或 todos.@each.owner.@each.name。

http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data/

您需要创建一个别名以将symbol 提升一个级别(不是咖啡脚本专家,希望您可以阅读黑客攻击,下面的positions 别名用于踢球和咯咯笑,没有区别)。

App.Position = Ember.Object.extend(
  instrumentSymbol: Em.computed.alias('instrument.symbol')
)

App.IndexController = Ember.ArrayController.extend
  selectedAllocation: null
  positions: Em.computed.alias('selectedAllocation.positions'),

  data: (->
    @get("positions").map (position) ->
      symbol: position.get "instrumentSymbol"
  ).property "positions.@each.instrumentSymbol"
  ...

http://jsbin.com/bivoyako/1/edit

【讨论】:

谢谢!当答案在文档中盯着你的时候一定会喜欢。我本可以发誓我尝试了别名,但也许我没有在正确的地方做。我会试一试并报告。 我是对的。我之前尝试过别名。但我没有做的是在计算的属性代码中访问别名。我还是getting instrument.symbol。我没有意识到这很重要。我认为只要属性列表中的某些内容被触发,计算属性就会触发,但事实并非如此。只有当我对正文中列出的属性使用吸气剂时,它才会触发。这是预期的吗? Ember 通常会延迟加载属性,因此在这种情况下,由于没有人访问过该属性,它可能永远不会评估它,也不会轮流观察它。 这是一个很好的猜想,但是当应用程序启动时它不是“点击一次”,因为它显示初始值(直接和间接)很好吗?我猜你的意思是别名? 是的,别名本身可能由于从未使用过而未初始化。

以上是关于Ember 计算属性在绑定到深度嵌套的属性时不会触发的主要内容,如果未能解决你的问题,请参考以下文章

不会重新计算基于数组值的计算属性

允许绑定到ember组件上的任何data- *属性

Ember.js 不会自动绑定模型 RESTful 更改

利用“除非有东西试图获取它们,否则不会计算计算的属性”

Ember.JS - 无法根据计算属性进行过滤或过滤

如何创建将 1 添加到属性的 Ember 计算属性?