【问题标题】:Filtering store data in ember在 ember 中过滤存储数据
【发布时间】:2016-06-06 12:59:03
【问题描述】:

我正在尝试过滤由 Mirage 提供的 Ember 路由中的一些硬编码数据并且遇到问题。

Ember 抱怨我的语法(尝试在商店中使用 filter 时)或者当我使用 findAll 然后对对象使用 JS 过滤方法时它不返回任何数据。

尝试 1 - 使用 findAll():

路线

export default Ember.Route.extend({
    model() {
        return {
            txSites: this.get('store').findAll('site').filter((site) => {
                return site.siteType === 'tx'; 
            })
        };
    }
}); 

模板

            <select class="form-control">
                {{#each model.txSites as |site|}}
                    <option value="{{site.id}}">{{site.name}}</option>
                {{/each}}
            </select>

幻影端点

this.get('/sites', () => {    

 return {
     data: [{
         type: 'site',
         id: 1,
         attributes: {
             name: 'London',
             siteType: 'tx'
         }
     },
     {
         type: 'site',
         id: 2,
         attributes: {
             name: 'Bristol',
             siteType: 'rx'                 
         }
     }]
  }      
});

结果

请求成功:GET /sites 对象{数据:数组[2]}

但没有绑定到下拉列表(我不尝试过滤结果的其他调用工作正常)。

尝试#2:使用filter:

export default Ember.Route.extend({
    model() {
        return {
            txSites: this.get('store').filter('site', (site) => {
                return site.siteType === 'tx'; 
            })
        };
    }
});

结果

没有调用 API

尝试 #3:使用过滤器

export default Ember.Route.extend({
    model() {
        return {
            txSites: this.get('store').filter('site', { siteType: 'tx' }, (site) => {
                return site.siteType === 'tx'; 
            }).then((results) => { return results })
        };
    }
});

结果

请求成功:GET /sites?siteType=tx 对象{数据:数组[2]}

但没有数据绑定到选择项。

感觉我在这里缺少一些基本的东西。使用 ember 2.5 和 ember data 1.13。

有没有推荐的方法来解决这个问题?

编辑:

尝试 #4 - findAll 与 RSVP 哈希:

路线

export default Ember.Route.extend({
    model() {
        return Ember.RSVP.hash({
            oneThing: this.store.findAll('oneThing'),
            anotherThing: this.store.findAll('anotherThing'),
            txSites: this.store.findAll('site').filter((site) => {
                console.log(site);
                return site.siteType === 'tx';
            })
        });
    }
});

结果

对oneThing 和anotherThing 的调用都可以绑定,但txSites 不行。

作为进一步的测试,我从txSites 属性中删除了.filter,这很高兴地返回了整个数据集并且绑定正常(所以我很高兴它是导致问题的过滤器并且绑定正常)。

尝试 #5

路线

export default Ember.Route.extend({
    model() {
        return Ember.RSVP.hash({
            oneThing: this.store.findAll('oneThing'),
            anotherThing: this.store.findAll('anotherThing'),
            txSites: this.store.findAll('site')
                 .then(results => results.filter((site) => {
                    return site.siteType === 'tx'; 
                 }))
        });
    }
});

结果

没有返回数据,控制台在过滤器中记录site 似乎是一个承诺,而不是已解决的承诺的结果。

【问题讨论】:

    标签: ember.js filter ember-data


    【解决方案1】:

    您应该在“findAll”承诺解决后进行过滤,如下所示:

    model() {
        return Ember.RSVP.hash({
            oneThing: this.store.findAll('oneThing'),
            anotherThing: this.store.findAll('anotherThing'),
            txSites: this.store.findAll('site')
                     .then(results => results.filter((site) => {
                        return site.get('siteType') === 'tx'; 
                     });
        });
    }
    

    同样在海市蜃楼中,您应该使用虚线化的值,所以使用 'site-type' 而不是 siteType。

    【讨论】:

    • 嗨,Igor,恐怕我已经尝试了上面的代码,但无济于事。它什么也没给我。如果我在上面的代码中控制台记录site,我会得到我认为是余烬的承诺(不是网站本身),我已将此附加到原始问题
    • 你厌倦了这个确切的代码,或者你在谈论你的尝试#4?因为它们不一样。
    • 在我添加的第 5 次尝试中,它实际上是从您的版本中复制和粘贴的。
    • 是的,抱歉,我没有看到尝试 #5。我的代码错了……你应该return site.get('siteType') === 'tx';
    • 你确实有你的 ember "site" 对象,但不能直接访问属性,因为它不是一个常规的 JSON 对象,所以你应该使用 get() 来代替
    【解决方案2】:

    你没有从你的模型函数中返回数据。这样做。

    model(){
        return this.get('store').findAll('site').filter((site) => {
            return site.siteType === 'tx';
        });
    }
    

    然后在模板中作为:

    {{#each model as |site|}}
    

    更新:

    我建议您改为查询商店:

    this.store.query('site', { filter: { siteType: 'tx' } });
    

    更新2:

    你可以在afterModel钩子中过滤txSites,模型钩子的所有promise都会被解析。

    【讨论】:

    • 感谢您的反馈:#1 我在商店中看到很多调用过滤器的示例。事实上,您链接的页面说:“注意:使用上述任何方法创建新记录时,Ember Data 将更新 DS.RecordArrays,例如 store#peekAll()、store#findAll() 或 store#filter() 返回的那些”。 #2。如果我想要我的模型上的多个属性怎么办?我已经有两个属性可以作为 model() 钩子返回的对象的属性正常工作,只是过滤器版本不起作用。
    • 如果您想要模型上的多个属性,那么您应该返回 Ember.RSVP.hash,并在其中定义您想要的属性。在多个模型下检查它。 guides.emberjs.com/v2.1.0/routing/specifying-a-routes-model
    • 感谢 RSVP 哈希链接,我的模型看起来和以前一样,只是没有包含在哈希中。作为测试,我从 findAll() 调用的末尾删除了.filter(),它返回了整个集合,但添加过滤器什么也没返回:/
    • 也许您应该在商店使用查询,guides.emberjs.com/v2.0.0/models/finding-records 或查看此链接stackoverflow.com/questions/28977099/…
    • Store 返回 promise 并且必须在使用过滤器之前解决它,我才意识到我的回答不好。
    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 2015-04-10
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 2018-03-08
    相关资源
    最近更新 更多