2

重複する値を持つ可能性のある一連のデータを扱っています。最初にデータを追加するときは、クライアントで利用できるわずかな情報 (メモリ内のモデルに保存されている静的情報) を使用しています。

しかし、handlebars テンプレートが表示されるたびに最新のものを取得する必要があるため、最初の ember アプリが起動されてからサーバー側にヒットした可能性のある新しいデータを取得するために、計算されたプロパティで「findAll」も起動します。

このプロセス中に、ember-data モデルで「addObjects」メソッドを使用しますが、サーバー側が返されると、配列に重複したレコードが表示されます (同じ clientId を持っていないためと仮定します)。

App.Day = DS.Model.extend({
    appointments: function() {
        //this will hit a backend server so it's slow
        return App.Appointment.find();
    }.property(),
    slots: function() {
        //no need to hit a backend server here so it's fast
        return App.Slot.all();
    }.property(),
    combined: function() {
        var apts = this.get('apppointments'),
        slots = this.get('slots');
        for(var i = 0; i < slots.get('length'); i++) {
          var slot = slots.objectAt(i);
          var tempApt = App.Appointment.createRecord({start: slot.get('start'), end: slot.get('end')});
          apts.addObjects(tempApt);
        }            

        return apts;
    }.property()
});

約束が解決されたときに「これは既に AdapterPopulatedRecordArray に存在するため、2 回表示する代わりにその値を更新する」ことがわかるように、ember-data モデルにそれを一意にする理由を伝えることは可能ですか?

4

1 に答える 1

2

使用できます

DS.RESTAdapter.map('App.Slot', {
  primaryKey: 'name-of-attribute'
});
DS.RESTAdapter.map('App.Appointment', {
  primaryKey: 'name-of-attribute'
});

App.Slotしかし、とは異なるモデル クラスであるため、まだ不可能だと思いますApp.Appointment。したがって、同じ ID を持っていると役に立ちません。これを機能させるには、スロットと予定の両方に同じモデルを使用する必要があります。

編集

ember-dataのソースを調べた後、クラスを定義するときに、次のように定義できると思います。primaryKey

App.Slot = DS.Model.extend({
    primaryKey: 'myId',
    otherField: DS.attr('number')
});

私はそれをテストしませんでしたが..

編集 2

さらに読んだ後、以前の編集はサポートされなくなったようです。map前に書いたように使用する必要があります。

于 2013-02-07T12:44:45.017 に答える