我发现这很奇怪,每当我在控制器中声明变量并且我想从模型中返回过滤值时,我必须使用一个函数。但是当我尝试使用{{#each}}
调用它时,它会给我一个错误。
Uncaught Error: Assertion Failed: The value that #each loops over must be an Array. You passed function () {
return this.store.filter('entry', function(entry) {
return (entry.get('entry_week') == moment().week());
});
}
我的控制器
App.CurrentWeekController = Ember.ArrayController.extend({
current_week: function() {
return this.store.filter('entry', function(entry) {
return (entry.get('entry_week') == moment().week());
});
}
});
编辑: 路线
App.CurrentWeekRoute = App.AuthenticatedRoute.extend({
model: function() {
return this.store.find('entry');
},
setupController: function(controller, entries) {
controller.set('model', entries);
}
});
把手
{{#each current_week}}
{{description}}
{{/each}}
那么什么是更好的方法?我基本上有很多模型实例,我需要在某些条件下过滤它们并单独显示它们。
在任何情况下,我如何让控制器变量包含一组过滤的模型实例。
答案 0 :(得分:2)
您可以清空控制器,然后更新您的路线:
App.CurrentWeekRoute = App.AuthenticatedRoute.extend({
model: function() {
var current_week = moment().week();
return this.store.filter('entry', function(entry) {
return entry.get('entry_week') == current_week;
});
}
});
现在,仅仅因为你在这里有这个代码并不意味着会出现一些东西。您的过滤器可能无法正常工作。
您可能希望在hbs文件中执行此操作:
{{#each current_week}}
{{description}}
{{else}}
<p>No entries this week.</p>
{{/each}}
答案 1 :(得分:1)
您需要将这些功能声明为您用于过滤项目的属性的Computed Properties。
此外,您不必使用DS.Store#filter
,而是使用App.CurrentWeekController
模型上的Ember.Enumerable#filter。 model
属性已包含所有App.Entry
条记录的实时集合。
App.CurrentWeekController = Ember.ArrayController.extend({
current_week: function() {
return this.get('model').filter(function(entry) {
return (entry.get('entry_week') == moment().week());
});
}.property('@each.entry_week')
});
有一点需要注意,current_week
数组不会在moment().week()
更改时更新。您需要某种方法确保在本周更改时重新计算current_week
。看看http://emberjs.com/guides/cookbook/working_with_objects/continuous_redrawing_of_views/的灵感。
假设您的模型为App.Entry
,请在模型定义中定义isCurrentWeek
计算属性,并在模板中使用它以仅显示这些属性。
App.Entry = DS.Model.extend({
// ...
isCurrentWeek: function() {
return this.get('entry_week') == moment().week();
}.property('entry_week')
});
在你的模板中:
{{#each}}
{{#if isCurrentWeek}}
{{description}}
{{/if}}
{{/each}}
答案 2 :(得分:1)
我想加入一百万个好答案的潮流:)我建议使用filterBy
,快速而干净。
App.CurrentWeekController = Ember.ArrayController.extend({
current_week: function() {
return this.filterBy('entry', moment().week());
}.property('@each.entry_week')
});