2

我有一个打印预订列表的应用程序。有2条路线:

reservations.allReservations

reservations.newReservations

问题:

allReservations 路线运行良好。如果预订被删除或添加,它会自动反映在页面上。但是, newReservations 路由不会在更改时刷新 - 但是,如果我重新加载页面,更改就在那里。

设置:

两者的主要区别在于路由模型字段。对于 allReservation 路线,它是:

App.Reservations.all();

对于 newReservation 路线,它是:

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

应用程序模型和数据存储设置为在TodoMVC 应用程序的 Ember.js 版本中

路线:

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

另一种解决方案可能是在 Reservation 模型上添加过滤器方法,并在商店中保持一致。

于 2013-04-22T21:35:53.350 回答