【问题标题】:Ember.js: How one model can observe other models?Ember.js:一个模型如何观察其他模型?
【发布时间】:2013-11-24 21:05:50
【问题描述】:

我的sources 有一个模型,每个segment 都有一个模型。每个来源都有许多段。每个段都有一个切换isSelected 属性的操作。

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    我认为您的问题分为三个部分:

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

    观察一个集合

    @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 对象和 Ember 模型之间的区别。 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')
    });
    

    【讨论】:

    • 是的,我的模型可能不相关。我只是在解决这些问题。上面的代码是否创建了这种关系?看起来它只是在同一个模型中创建了一个属性。
    • 我已经使用 Ember 大约 8 天了,是否使用 Ember Data 对我来说是一件很难弄清楚的事情。关于我是否应该在生产项目中使用它看起来存在分歧。最终,我能得到的第一个工作代码没有使用 Ember Data,所以我正在使用它。这是我在这里遇到的麻烦/困惑的一部分吗?
    • 不,我认为这些问题是可分离的:1)过滤数组(谁在乎你是如何得到数组的)和 2)管理关系(hasMany 将有助于管理数组)。上面的代码没有建立关系,您需要以某种方式将对象推送到段中。 Ember 数据模型将使用 DS.Model.extend() 创建。
    • 非常有帮助。现在工作得很好。竖起大拇指。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    相关资源
    最近更新 更多