Ember js - 在对每个循环进行排序和过滤时,模板中的语法正确

时间:2015-07-31 15:01:54

标签: javascript ember.js

我有一个输出数据表的每个循环。每行包括created_date,title,publisher和category。为了在相关控制器中使用sortProperties(通过created_date对帖子进行排序),我将其设置为循环控制器:



<button {{action 'reverseOrder' 'created_date'}}>Reverse Date Order</button>
{{#each controller as |post|}} 
  ...
{{/each}}
&#13;
&#13;
&#13;

我还希望有按钮按其他列过滤此列表(例如发布者)。我查看了this jsbin example,它将filteredContent传递给模板中的每个帮助器,然后在控制器中使用它来进行过滤:

&#13;
&#13;
{{#each filteredContent}}
...
{{/each}}
&#13;
&#13;
&#13;

&#13;
&#13;
App.IndexController = Em.ArrayController.extend({

  filteredContent: [],

  actions: {
    filterByPublisher: function(filterFn) {
      this.set('filteredContent', this.get('model').filter(filterFn));
    }
  }
});
&#13;
&#13;
&#13;

将filteredContent传递给已指定控制器的每个帮助程序的正确方法是什么?

我尝试了各种各样的事情 -

&#13;
&#13;
{{#each controller as |post| filteredContent}}
{{#each filteredContent controller as |post|}} 
&#13;
&#13;
&#13;

但是我收到如下错误:

未捕获错误:断言失败:如果您将多个参数传递给每个帮助器,则它必须采用{{#each foo in bar}}

的形式

1 个答案:

答案 0 :(得分:0)

您无法将两个参数传递给{{#each}}{{#each}}助手只接受一个参数,这是一个要迭代的数组。

创建一个计算属性,该属性将返回根据所有选项排序和过滤的数据数组。

示例:

  // Item format: {foo: 1, bar: 2, baz: 5}

  result: Ember.computed(
    'model.@each.foo',
    'model.@each.bar',
    'model.@each.baz',
    'sortColumn',
    'sortAsc',
    'filterMinFoo',
    'filterMinBar',
    'filterMinBaz',    
    function() {
      var filterMinFoo = this.get('filterMinFoo');
      var filterMinBar = this.get('filterMinBar');
      var filterMinBaz = this.get('filterMinBaz');

      var result = this
        .get('model')
        .filter(function(item) {
          return item.get('foo') >= filterMinFoo &&
            item.get('bar') >= filterMinBar &&
            item.get('baz') >= filterMinBaz;
        })
        .sortBy(this.get('sortColumn'));

      return this.get('sortAsc') ? result : result.reverse();
    }
  )

演示:http://emberjs.jsbin.com/kegavo/1/edit?html,js,output