Ember数据 - 从子

时间:2015-05-21 18:35:40

标签: javascript ember.js ember-data

我有一个小的父子关系的小部件模型。给定的小部件可以是" root"小部件,没有任何父级,或者它可能是具有父级的子小部件。

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')}"
  }
})

然而,这不起作用。儿童吊球的displayName始终为

undefined - WidgetName

json正如此返回:

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

为了记录,所有记录都在同时由json返回。

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

1 个答案:

答案 0 :(得分:2)

我想说你有两个问题:

  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财产。因此,如果name上的parentWidget属性每次更新,您都不会收到通知。将该行更改为此,您应该很高兴:

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

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