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

4

我有一个关于sources的模型,以及每个segment的模型。每个源都有许多段落。每个段落都有一个可以切换isSelected属性的操作。

我需要保持选定段落的更新列表。我的第一个想法是做一些像...

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

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

...但是那个observes()函数不正确。我对ember很陌生,所以我的方法可能完全错误。

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

编辑:更正名称以表示segment模型是单个段落的模型-而不是段落集合(这是我计划在sources模型中实现的)。

1个回答

6
我认为你的问题分为三个部分:
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 Data,您可能会有以下内容:

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')
});

是的,我的模型可能没有关联。我只是在处理这些东西。上面的代码是否创建了那种关系?看起来它只是在同一个模型内创建了一个属性。 - doub1ejack
我已经接触Ember大约8天了,使用Ember Data还是不使用一直是我难以理解的问题。对于是否应该在生产项目中使用它似乎存在分歧。最终,我能够编写的第一个可工作的代码并没有使用Ember Data,所以我就沿用这个方案了。这是我在这里遇到的困惑和混淆的部分吗? - doub1ejack
不,我认为这两个问题是可以分开解决的:1)过滤一个数组(无论你如何获得该数组都无关紧要),2)管理关系(hasMany 可以帮助管理该数组)。上面的代码并没有建立起关系,您需要找到一种方法将对象推入段中。Ember 数据模型可以使用 DS.Model.extend() 创建。 - Amir T
非常有帮助。现在运行得相当不错。点赞。 - doub1ejack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接