【问题标题】:Ember Data - Get parent value from childEmber Data - 从孩子那里获取父值
【发布时间】:2015-05-21 18:35:39
【问题描述】:

我有一个具有浅父子关系的小部件模型。给定的小部件可能是“根”小部件并且没有任何父小部件,或者它可能是具有父小部件的子小部件。

ember 数据模型如下所示:

export default DS.Model.extend({
  name:         DS.attr('string'),
  parentWidget: DS.belongsTo('widget', { async: true, inverse: null }),
  isSubWidget:  DS.attr('boolean')
})

我正在尝试添加一个“displayName”属性,该属性将显示根小部件的名称,或子小部件的“父名称 - 子名称”

displayName: Ember.computed('name', 'parentWidget.name', 'isSubLob',  function() {
  if this.get('isSubWidget') {
    return "#{this.get('parentWidget.name')} - #{@get('name')}"
  }
  else {
    return "#{this.get('name')}"
  }
})

但是,这不起作用。子 lob 的 displayName 始终为

undefined - WidgetName

json 是这样返回的:

{
"widgets": [
  {
    "id": 2,
    "name": "Widget Name",
    "is_sub_widget": true,
    "parent_widget_id": 1
  },
  ...
}

对于记录,所有记录都被json同时返回。

我觉得 Ember 应该 异步解析父小部件,并且字符串也应该更新,但它似乎不起作用。知道我在这里做错了什么吗?

【问题讨论】:

    标签: javascript ember.js ember-data


    【解决方案1】:

    我会说你有两个问题:

    1. 您没有声明与您的 parentWidget 关系相反,这意味着 Ember Data 猜测的是相反的(并且可能猜测错误)。您应该将该声明更改为如下所示,以确保:

      parentWidget: DS.belongsTo('widget', { async: true, inverse: null }),
      

      我怀疑这会解决您的问题,但这是一种很好的做法。

    2. 在尝试使用该名称之前,您无需等待您的承诺解决。您已将 parentWidget 关系指定为异步的,这意味着 @get('parentWidget')不会返回模型。它将返回一个 promise,最终将解析为您的模型。通常这会很好,因为计算属性只会在 promise 解决时重新计算,除非您没有查看正确的密钥。

      /* PS: Assuming that your comma was misplaced on this line */
      displayName: Ember.computed('name', 'parentWidget', function() {
                                           ^^^^^^^^^^^^
      

      如您所见,您只看到了parentWidget 属性。因此,如果parentWidget 上的name 属性每次更新,您将不会收到通知。将该行更改为此,您应该很高兴:

      displayName: Ember.computed('name', 'parentWidget.name', function() {
      

      请记住,前几次,parentWidget.name 仍将是 undefined。在 Promise 解析之前,它不会是您想要的值,这意味着计算的属性可能会在它解析之前运行多次。

    【讨论】:

    • 没有骰子。我对这些更改进行了一些更新,但我应该澄清一下,所有小部件(大约 300 个,不太可能更改)都会加载到路线中,并且仅当我稍后尝试从下拉列表中选择时才会显示。我真的觉得它在显示时应该已经拥有了它需要的所有数据。
    • 所以要缩小这个问题的范围,我需要两条信息。首先,当 promise 解决时,计算的属性是否会重新计算? (它运行了多少次?)其次,如果最后一次在计算属性中放置一个断点,那么模型在 Ember Inspector 中是什么样子的?它解决了吗?它有name 属性吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 2019-09-21
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多