Ember属性观察对象的对象属性

时间:2014-07-29 12:39:48

标签: ember.js

我正在研究高级数据模型,必须将其显示在列表中。

基本上该模型有三个类

列表:

Application.List = DS.Model.extend({
    modules: DS.hasMany('module', {async: false})
});

包含许多模块:

Application.Module = DS.Model.extend({
    position:        DS.attr('number', {defaultValue: 0}),
    module_category: DS.belongsTo('module_category'),
});

属于模块类别:

Application.ModuleCategory = DS.Model.extend({
    position: DS.attr('number', {defaultValue: 0}),
});

问题是,页面必须在其类别下显示列表模块,这些模块按其position-attribute排序。在一个类别中,模块也按其位置属性排序。

-> category 1
  - module
-> category 2
  - module
  - module
  ...

我使用一个属性来管理它,该属性将模块放入一个数组(按其位置和类别位置排序),并在第一次出现之前添加类别(对象)。所以数组的第一个对象总是一个类别(位置最低的那个),后跟属于该类别的模块

然后{{#each}}帮助程序使用此数组来显示。

到目前为止一切正常。

我还有一个拖放机制,因此用户可以更改类别和模块的位置。

但是不起作用的是位置属性的观察者,因此列表不会重新渲染。

}.property('model.modules.@each.position', 
    'model.modules.@each.module_category.position'),

第一部分(' model.modules。@ each.position')工作正常,每次模块移动时列表都会自动更新。

但是第二部分(' model.modules。@ each.module_category.position')不起作用,因此拖动类别不会强制重新渲染。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

@each只能深入一级。 (请参阅http://emberjs.com/guides/object-model/computed-properties-and-aggregate-data/的底部)如果您需要观看并且项目更深,请将其提升一级。

Application.Module = DS.Model.extend({
    position:        DS.attr('number', {defaultValue: 0}),
    module_category: DS.belongsTo('module_category'),
    module_category_position: Em.computed.alias('module_category.position')
});

并更新您的财产(通常模型在范围内,因此不需要明确说明,但我不知道您的范围在这里)

}.property('modules.@each.position', 
'modules.@each.module_category_position'),