javascript - 过滤器的 Ember.js 路由问题

标签 javascript ember.js ember-data

我的目标是将过滤后的数据传递到我的 Controller ,然后传递到我的模板。我试过不使用过滤器,一切都按预期工作。即使我什至尝试使用让所有内容通过的过滤器,我也得不到任何数据。我什至尝试使用 false 而不是 true 并摆弄过滤器的参数列表。

我正在使用 ember-data 装置对此进行测试。我遵循命名约定,所以很多工作都是在后台为我完成的。不过这一切似乎都有效(否则第一个示例也应该有问题)。

有效(到达 Controller 并最终呈现在页面上):

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

失败( Controller 得到一个空数组):

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

更新(尝试 1):

好的,所以我根据 Sam Selikoff 的回答尝试了一些方法。我在 Controller 中定义了 4 个属性(2 个过滤器、一个 map 、一个普通副本)并尝试在模型页面中显示每个属性。只有属性 copyDomain 给出了结果。

Controller 中的属性:

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>

最佳答案

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

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

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}}
  ...

关于javascript - 过滤器的 Ember.js 路由问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29282483/

相关文章:

ember.js - ember-data中相关模型之间的关系是如何建立的

ember.js - 如何在 Ember 1.0.0-RC3 中将 emberjs 对象转换为 JSON

javascript - 使用 d3 自定义气泡位置

javascript - 在 javascript 函数中设置常量

ember.js - 将模型推送到商店时更新 View

javascript - Ember 。 DS.Adapter 的自定义 createRecord 不会被触发

javascript - 使用 jQuery 计时器更改 div 的悬停状态

javascript - 使用 forEach 访问对象数据,而不使用 forEach 的 thisArg?

css - 如何将 INSPINIA Bootstrap 添加到 Ember 应用程序

javascript - Ember Data 不为新实例创建 ID