在Ember.js中返回函数错误

时间:2014-06-22 18:40:47

标签: javascript 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}}

那么什么是更好的方法?我基本上有很多模型实例,我需要在某些条件下过滤它们并单独显示它们。

在任何情况下,我如何让控制器变量包含一组过滤的模型实例。

3 个答案:

答案 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#filtermodel属性已包含所有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')
});

http://emberjs.jsbin.com/OxIDiVU/702/edit