Ember-data根据id和其他参数查找记录?

时间:2014-07-14 21:08:15

标签: javascript ember.js ember-data

在Ember文档中,我发现find()支持通过id查找:

this.store.find('post', 1); // => GET /posts/1

并且还通过传递任意参数:

this.store.find('post', { name: "Peter" }); // => GET to /posts?name='Peter'

但在我的情况下,我必须通过id找到,并传递一个额外的参数来请求所有字段包含在响应中(默认情况下会省略一些),如下所示:

this.store.find('post', 1); // => GET /posts/1?include=all

我试着这样做:

this.get('store').find('post', params.post_id, { include : 'all' });

但是我的参数被忽略了。

这似乎是一个相当基本的用例,所以我必须遗漏一些东西......

我该如何做到这一点?

6 个答案:

答案 0 :(得分:3)

到目前为止,您可能已经找到了解决问题的方法,但要采用的方法是在adapterOptions参数上使用options

所以,我们走吧:

  1. 在获取模型(即路线)的位置,设置所需的自定义参数。在你的情况下,包括。它是这样的:

    //file app/routes/post/edit.js
    
    import Ember from 'ember';
    
    export default Ember.Route.extend({
      model: function(params) {
        return this.store.findRecord('post', params.post_id, {
          adapterOptions: { include: 'all' }
        });
      }
    });
    
  2. 在模型的适配器中读取此值以自定义ajax请求:

    //file app/adapters/post.js
    
    export default JSONAPIAdapter.extend({
      findRecord: function(store, type, id, snapshot) {
        if (Em.get(snapshot, 'include')) {
          let url = this.buildURL(type.modelName, id, snapshot, 'findRecord');
          let query = this.buildQuery(snapshot);
          return this.ajax(url, 'GET', { data: query });
        } else {
          this._super(...arguments);
        }
    });
    
  3. 更新1:

    在ember-data较新版本(> = 2.4.0)上,您可以通过调用开箱即用 store.findRecord('post', {include: 'all'});

答案 1 :(得分:2)

PhStoned的代码有效,但如果adapterOptions为空,则会导致错误。这是一个改进版本。

%%
clc
%clear all
close all
G=1000;
R=0.372;
Rs=0.2;
lamda=300*10^(-9);
I=0.01;
h=6.626*10^(-34);
c=3*10^8;
mun=100;
taun=5*10^(-9);
mup=25;
taup=5*10^(-9);
e=8.854*10^(-12);
alpha=0.473;
We=50*10^(-9);
Wa=5*10^(-9);
ni=1;
%VD=-10:0.01:10;
q=1.602*10^(-19);
n=1.5;
k=1.38*10^(-23);
T=283;
Na=1*10^(14);
VT=((k*T)/q);    %VT=KT/q
G= ((1-R)*(lamda*I))/(h*c);%G=(1-R)?I/hc
%%
syms x
fn=int(1/(mun*taun*((q*Na*(x-Wa))/e)));
FN=int(exp(-(alpha+fn)),(We+Wa),(We+x)); 
Jn=q*G*alpha*exp(fn)*FN;
fp=int(1/(mup*taup*((q*Na*(x-Wa))/e))); 
FP=int(exp(-(alpha+fp)),(We+x),We);
Jp=q*G*alpha*exp(fp)*FP
%% 
nx=2001;
x=(-10:20/(nx-1):10)'; 
VL=(0:5/(nx-1):5)';
JN=eval(Jn);
JP=eval(subs(Jp));
Jph=JN+JP;
J0=((q*ni*Wa)/(2*sqrt(taun*taup)));
%%
J(1,1)=0;
for j=2:nx
    j
    Jpart(j,1)=J0*(exp(VL(j,1)-(J(j-1,1)*Rs)/(n*VT)))-1;
    J(j,1)=-Jph(j,1)+Jpart(j,1); 
    plot(VL(1:j,1),real(J(1:j,1)));
end

答案 2 :(得分:1)

如果要将其他参数传递给后端,可以使用queryRecord而不是find。

this.store.queryRecord('post', { id: params.post_id, include: 'all' }).then(function(data) {
  // do something with `data`
});

答案 3 :(得分:1)

罗德里戈·马罗基姆的回答并不适合我。所以我来到以下解决方案
Ember v2.6.0

7b.sh:7: [:expr : unexpected oprerator

用法:

import Ember from 'ember';
import applicationAdapter from './application';

export default applicationAdapter.extend({
  findRecord: function(store, type, id, snapshot) {
    if (Ember.get(snapshot.adapterOptions, 'include')) {
      let url = this.buildURL(type.modelName, id, snapshot, 'findRecord');
      let query = {
        include: Ember.get(snapshot.adapterOptions, 'include')
      };
      return this.ajax(url, 'GET', { data: query });
    } else {
      this._super(...arguments);
    }
  }
});

答案 4 :(得分:0)

我的建议是尝试使用查询功能而不是查找功能。这将允许您查询无限数量的过滤器。

var myStore = this.get('store');
myStore.query('post', { 
    _id: params.post_id,
    include : 'all'
 }).then(function(peters) {
      // Do something with `peters`
});

答案 5 :(得分:0)

在此处将ajax与适配器实现一起使用可能会有所帮助:

const { getOwner } = Ember;
let adapter = getOwner(this).lookup('adapter:application');
adapter.ajax(
  adapter.buildURL(`posts/${id}`), 'GET', { data: { include: 'all' } }
);

#> /posts/1?include=all

这个ajax解决方案更好:

const { inject: { service } } = Ember;

export default Ember.Route.extend({
  ajax: service(),

  async model(params) {
    let id = params.id;

    return await this.get('ajax')
      .request(`/posts/${id}`, {
        data: { include: 'all' }
      }).then(({ post }) => {
        if (post) {
          return this.store.push(this.store.normalize('post', post));
        }
      });
  }
});