4

私は自分sourcesのモデルとそれぞれのモデルを持っていますsegment。各ソースには多くのセグメントがあります。各セグメントには、プロパティを切り替えるアクションがありisSelectedます。

選択したセグメントの最新リストを保持する必要があります。私の最初の考えは、次のようなことをすることでした...

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

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

..しかし、そのobserves()関数は正しくありません。私は残り火が初めてなので、私のアプローチは完全に間違っている可能性があります。

あるモデルのメソッドが他の多くのモデルのプロパティを観察するにはどうすればよいでしょうか?

編集: セグメント モデルが単一のセグメント用であることを示すように名前を修正しました。セグメントのコレクションではありません (これは、ソース モデルで行う予定です)。

4

1 に答える 1

6

あなたの質問には3つの部分があると思います:

  1. コレクションを観察する方法
  2. オブザーバー全般
  3. 関係の管理

コレクションを観察する

@each プロパティは、コレクション内のアイテムのプロパティを観察するのに役立ちます。segments.@each.isSelected

オブザーバー全般

.observes()関数の on は、オブザーバー関数を設定する省略形です。この関数の目的がコレクションを更新することである場合は.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')
});
于 2013-11-12T16:07:06.660 に答える