我有一个小的父子关系的小部件模型。给定的小部件可以是" 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 应该异步解析父窗口小部件,字符串也应该更新,但它似乎并没有起作用。知道我在这里做错了吗?
答案 0 :(得分:2)
我想说你有两个问题:
您并未声明与parentWidget
关系的反转,这意味着Ember Data正在猜测反向(并且可能猜错了)。您应该将此声明更改为这样,只是为了确保:
parentWidget: DS.belongsTo('widget', { async: true, inverse: null }),
我怀疑这会解决你的问题,但这是一种很好的做法。
在尝试使用该名称之前,您并没有等待您的承诺解决。您已将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解析之前,它不会成为您想要的值,这意味着计算属性可以在解析之前运行几次。