Ember.js路由问题与过滤器

时间:2015-03-26 15:27:16

标签: javascript ember.js ember-data

我的目标是将过滤后的数据传递给我的控制器,然后传递给我的模板。我试过不使用过滤器,一切都按预期工作。如果我甚至尝试使用过滤器让一切都通过,我不会得到任何数据。我甚至尝试使用false而不是true并且使用过滤器的参数列表。

我正在使用ember-data fixture来测试它。我正在遵循名称惯例,因此很多工作都是为我完成的。这一切似乎都有效(否则第一个例子也应该有问题)。

Works(到达控制器并最终在页面上呈现):

App.DomainDirRoute = Ember.Route.extend({
  model: function(params) {
    return this.store.find('domain_dir');
  }
});

失败(控制器获取一个空数组):

App.DomainDirRoute = Ember.Route.extend({
  model: function(params) {
    return this.store.filter('domain_dir', function(item){
        return true;
    });
  }
});

更新(ATTEMPT 1):

好的,所以我根据Sam Selikoff的回答尝试了几件事。我在控制器中定义了4个属性(2个过滤器,一个映射,一个普通副本),并尝试在模型页面中显示每个属性。只有属性copyDomain才会给出结果。

控制器中的属性:

filteredDomains: Ember.computed.filterBy('domain', 'domain', true),
upperCaseDomains: Ember.computed.map('domain', function(domain, index) {
    return domain.toUpperCase() + '!';
  }),
filteredDomains2: function() {
    return this.get("model").filterBy('domain', true);
  }.property('model.@each.domain'),
copyDomains: function(){
    result = [];
    this.forEach(function(item) {
        result.pushObject(item);
    })
    console.log(result);
    return result;
}.property('model.@each.domain')

样机:

        <ul>
            <li>filteredDomains</li>
        {{#each domainDir in controller.filteredDomains}}
            <li>domainDir.domain</li>
        {{/each}}
        </ul>
        <ul>
            <li>filteredDomains2</li>
        {{#each domainDir in controller.filteredDomains2}}
            <li>domainDir.domain</li>
        {{/each}}
        </ul>
        <ul>
            <li>upperCaseDomains</li>
        {{#each domainDir in controller.upperCaseDomains}}
            <li>domainDir.domain</li>
        {{/each}}
        </ul>
        <ul>
            <li>copyDomains</li>
        {{#each domainDir in controller.copyDomains}}
            <li>domainDir.domain</li>
        {{/each}}
        </ul>

1 个答案:

答案 0 :(得分:1)

过滤通常在控制器/组件级别完成。 store.find发出AJAX请求。您的目标是仅从服务器检索已过滤的数据子集,还是过滤您在视图层已有的数据?

通常,如果您只想进行一些实时过滤,则可以在控制器中进行。将模型挂钩保留为this.store.find('domain_dir')并在控制器中添加过滤器:

App.DomainDirController = Ember.Controller.extend({
  filteredDomains: function() {
    return this.get("model").filterBy('someProp', true);
  }.property('model.@each.someProp')
});

您还应该查看computed macros的一些简介:

App.DomainDirController = Ember.Controller.extend({
  filteredDomains: Ember.computed.filterBy('model', 'someProp');
});

现在,您可以在模板中执行

{{#each domain in filteredDomains}}
  ...