Ember.js:一个模型如何观察其他模型?

dou*_*ack 4 javascript model-view-controller model ember.js

我有一个模型为我sources和每个模型segment.每个来源都有很多细分.每个细分都有一个切换isSelected属性的操作.

我需要保留所选段的更新列表.我的第一个想法是做一些像......

App.Source = Ember.Object.extend({
  selectedSourceList = Em.A(),

  selectedSourcesObserver: function() {
    // code to update array selectedSourceList
  }.observes('segment.isSelected')
});
Run Code Online (Sandbox Code Playgroud)

..但是observes()函数不对.我是新手,所以我的方法可能完全错了.

一个模型中的方法如何观察许多其他模型的属性?

编辑:更正名称以指示段模型是针对单个段 - 而不是段的集合(这是我计划在源模型中执行的操作).

Ami*_*r T 6

我认为你的问题有三个部分:

  1. 如何观察集合
  2. 观察员一般
  3. 管理关系

观察一个集合

@each属性有助于观察集合中项目的属性: segments.@each.isSelected

观察员一般

.observes()函数是设置观察函数的简写.如果此功能的目标是更新集合,则可以通过使用.property()设置观察者并将该函数视为属性来更好地服务:

selectedSegments: function() {
  return this.get('segments').filterProperty('isSelected', true);
}.property('segments.@each.isSelected')
Run Code Online (Sandbox Code Playgroud)

这意味着selectedSegments是来自此对象的段的子集,它们被选中并在项目被删除或标记为选中时自动管理.

管理关系

对于普通的Ember对象,您需要管理关系,将新项目推入数组等.

segments = Em.A(), //somehow you are managing this collection, pushing segments into it 
Run Code Online (Sandbox Code Playgroud)

另请注意Ember Objects和Ember Models之间的区别.Ember Data是一个可选的附加库,允许指定模型和关系,并帮助您管理模型.使用Ember数据,您可能会遇到以下情况:

App.Source = DS.Model.extend({

  //ember-data helps manage this relationship 
  //  the 'segment' parameter refers to App.Segment
  segments: DS.hasMany('segments'), 

  selectedSegments: function() {
    return this.get('segments').filterProperty('isSelected', true);
  }.property('segments.@each.isSelected')
});
Run Code Online (Sandbox Code Playgroud)

和App.Semgent

App.Segment = DS.Model.extend({
  selection: DS.belongsTo('selection')
});
Run Code Online (Sandbox Code Playgroud)