在ember中按属性获取记录

时间:2016-11-25 23:12:57

标签: javascript ember.js ember-data

在我的应用程序路由中,我获得了当前会话和用户。

/routes/application.js

import Ember from 'ember';

export default Ember.Route.extend({

    beforeModel: function() {
      return this.get('session').fetch().catch(function() {});
    },
    model () {
      return this.store.findRecord('user', this.get('session.currentUser.uid'));
    }
});

我的模型设置如下:

/models/bet.js

import DS from 'ember-data';

export default DS.Model.extend({
  created: DS.attr('date'),
  user: DS.belongsTo('user', { async: false })
});

/models/user.js

import DS from 'ember-data';

export default DS.Model.extend({
  email: DS.attr('string'),
  firstName: DS.attr('string'),
  lastName: DS.attr('string'),
  bets: DS.hasMany('bet', { async: true })
});

在我/ bets路线中,我只想加载user == session.currentUser.uid或类似方式的投注,只获得当前用户bets的{​​{1}}。

我已经尝试找到没有结果的最佳方法。

2 个答案:

答案 0 :(得分:1)

niave方法是将所有赌注过滤为您想要的赌注。基于api的解决方案可以是1)在对服务器的请求上使用查询参数,2)嵌套的URL如/users/2/bets。在任何一种情况下,您都必须在服务器上实现此功能。

示例1)过滤器

import Ember from 'ember';

export default Ember.Route.extend({
  model () {
    return this.store.findAll('bet').then((bets) => {
      const currentUserId = this.get('session.currentUser.uid')
      return bets.filter((bet) => {
        return bet.get('user.id') === currentUserId
      })
    });
  }
});

示例2)查询。您的服务器必须使用res

import Ember from 'ember';

export default Ember.Route.extend({
  model () {
    return this.store.query('bet', {
      userId: this.get('session.currentUser.uid')
    })
  }
});

示例3)嵌套属性。 为此,您需要做两件事:

  1. 用户带有links属性,如下所示:`{bets:' api / users /:uid / bets'}
  2. 您的服务器必须能够回复请求/api/users/:uid/bets并仅返回用户的投注
  3. 代码:

    import Ember from 'ember';
    
    export default Ember.Route.extend({
      model () {
        const currentUser this.store.peekRecord('user', this.get('session.currentUser.uid'))
        return currentUser.get('bets') // sends request to `api/users/:uid/bets`
      }
    });
    

答案 1 :(得分:0)

您使用的是Ember Simple Auth吗?如果是这样,您的请求将发送令牌,该令牌可用于根据提供的信息获取当前用户。由于仅返回当前用户的下注是默认行为,因此最好将逻辑保留在api端。任何其他类型的过滤器都应该使用query或queryRecord方法完成。