筛选 ember 中的商店数据

Filtering store data in ember

我正在尝试过滤 Ember 路由中的一些硬编码数据,该路由由 mirage 提供,但遇到了问题。

要么 Ember 抱怨我的语法(当试图在商店中使用 filter 时),要么当我使用 findAll 时 return 没有任何数据并且然后在对象上使用 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>

Mirage 端点

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

但没有数据绑定到 select 项。

感觉好像缺少一些基本的东西。使用 ember 2.5 和 ember 数据 1.13.

是否有解决此问题的推荐方法?

编辑:

尝试 #4 - 使用 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';
            })
        });
    }
});

结果

oneThinganotherThing 的调用都可以绑定,但 txSites 不能。

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

尝试 #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'; 
                 }))
        });
    }
});

结果

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

您没有正确地从您的模型函数返回数据。这样做吧。

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,模型挂钩中的所有承诺都将得到解决。

您应该在 'findAll' promise 解析后进行过滤,如下所示:

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'; 
                 });
    });
}

同样在 mirage 中你应该使用破折号值,所以 'site-type' 而不是 siteType。