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

时间:2013-11-12 15:57:41

标签: javascript model-view-controller ember.js model

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

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

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

  selectedSourcesObserver: function() {
    // code to update array selectedSourceList
  }.observes('segment.isSelected')
});

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

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

编辑:更正了名称以表明细分模型适用于单个细分 - 而不是细分的集合(我计划在资源模型中执行此操作)。

1 个答案:

答案 0 :(得分:6)

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

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

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

    一般观察员

    函数的

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

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

    这意味着selectedSegments是此对象中已选中的细分的子集,并会在项目被删除或标记为已选中时自动进行管理。

    管理关系

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

    segments = Em.A(), //somehow you are managing this collection, pushing segments into it 
    

    另请注意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')
    });
    

    和App.Semgent

    App.Segment = DS.Model.extend({
      selection: DS.belongsTo('selection')
    });