2013-04-22 28 views
2

我有一個打印預留列表的應用程序。有2種途徑:Ember.js - 已過濾的模型更改不會觸發已呈現模板中的更改

reservations.allReservations 

reservations.newReservations 

問題:

的allReservations路線工作正常。如果預訂被刪除或添加,它會自動反映在頁面上。但是,newReservations路由不會在更改時刷新 - 但是,如果我重新加載頁面,那麼更改就在那裏。

的設置:

這兩者之間的主要區別是路線模型字段。對於allReservation路線是:

App.Reservations.all(); 

爲newReservation路線是:

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

的應用模式和數據存儲是設置爲在Ember.js version of the TodoMVC app

路線:

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}} 

回答

2

爲了使用濾波陣列,我想你必須使用

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

它返回一個實時的FilteredRecordArray,當商店中加載了新的預訂時更新。

當您使用filterProperty()時,您將釋放FilteredRecordArray,然後結果數組不生效。

由於您沒有使用燼數據,您必須手動維護過濾器。我認爲可以這樣做。

最簡單的將是添加計算的屬性在控制器上,這將使該過濾的內容,並填充與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') 
}); 

另一種解決方案可能是在預訂模型上添加過濾器方法,並且一直在商店中添加。

+0

哦,對不起,看到all()方法,我假設您使用的是ember-data。我必須刪除我誤添加的標籤。我會盡力更新我的答案。 – 2013-04-22 21:45:28

+0

我將它改爲:App.Reservation.all()。filter(...這次我沒有得到任何錯誤,但仍然沒有更新.. – 2013-04-22 21:46:10

+0

是的,這很正常,因爲App.Reservation.all()。 filter()不會返回實時數組 – 2013-04-22 21:57:27