2

予約リストを印刷するアプリケーションがあります。2 つのルートがあります。

reservations.allReservations

reservations.newReservations

問題:

allReservations ルートは正常に機能します。予約を削除または追加すると、ページに自動的に反映されます。ただし、 newReservations ルートは変更時に更新されませんが、ページをリロードすると変更が反映されます。

セットアップ:

2 つの主な違いは、ルート モデル フィールドです。allReservation ルートの場合:

App.Reservations.all();

newReservation ルートの場合:

App.Reservations.all().filterProperty('isNew',true);

アプリケーション モデルとデータ ストアは、Ember.js バージョンの TodoMVC アプリと同様にセットアップされます。

ルート:

App.ReservationsNewReservationsRoute = Em.Route.extend({

model: function(){
       return App.Reservation.all().filterProperty('isNew', true);
    },

    renderTemplate: function(){
       this.render('reservationList');
    },
});

コントローラ:

App.ReservationsNewReservationsController = Ember.ArrayController.extend({

    isEmpty: function() { 
        return this.get( 'length' ) == 0;
    }.property( '@each.length', '@each.isNew'),

});

テンプレートreservationList.hbs:

{{#if isEmpty}}
    <li>
        <div class="text-center" style="height: 40px; margin: auto 0;">
            <label>No Reservations!</label>
        </div>
    </li>
{{/if}}
{{#each controller}}
   ... print reservations ...
{{/each}}
4

1 に答える 1

2

フィルタリングされた配列を使用するには、使用する必要があると思います

model: function(){
   return App.Reservations.filter(function(reservation){
     return reservation.get('isNew') === true;
   });
});

これは、ライブの FilteredRecordArray を返し、新しい予約がストアにロードされると更新されます。

filterProperty() を使用すると、FilteredRecordArray が失われ、結果の配列はライブではなくなります。

ember-data を使用していないため、フィルターを手動で維持する必要があります。これを行う方法があるかもしれないと思います。

最も簡単な方法は、コントローラーに計算されたプロパティを追加することです。これにより、フィルター処理されたコンテンツが返され、モデルにデータが入力App.reservations.all() されます。明らかにテンプレートでは、次の{{#each controller.filteredContent}} ようなものを使用します。

App.ReservationsNewReservationsController = Ember.ArrayController.extend({

  isEmpty: function() { 
    return this.get( 'filtered.length' ) == 0;
  }.property('filtered.length'),

  //will be evaluated each time a reservation is added/removed, 
  //or each time a reservation's isNew property changed.
  filteredContent: function(){
     return this.get('content').filterProperty('isNew', true);
  }.property('@each.isNew')
});

もう 1 つの解決策は、Reservation モデルにフィルター メソッドを追加し、一貫してストアに追加することです。

于 2013-04-22T21:35:53.350 に答える