在Ember.js中返回函数错误

用户名

我发现这很奇怪,每当我在控制器中声明变量并想从模型中返回过滤后的值时,我都必须使用一个函数。但是当我尝试使用{{#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}}

那么有什么更好的方法呢?实际上,我有很多模型实例,我需要按特定条件过滤它们并分别显示它们。

无论如何,如何让一个控制器变量包含一组过滤后的模型实例。

帕纳吉奥提斯·帕纳吉

您需要将这些函数声明为用于过滤项目的属性的“计算属性”。

此外,您不必使用DS.Store#filter,而应在模型使用Ember.Enumerable#filterApp.CurrentWeekControllermodel属性已经包含您所有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}}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章