在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' });
但是我的参数被忽略了。
这似乎是一个相当基本的用例,所以我必须遗漏一些东西......
我该如何做到这一点?
答案 0 :(得分:3)
到目前为止,您可能已经找到了解决问题的方法,但要采用的方法是在adapterOptions
参数上使用options
。
所以,我们走吧:
在获取模型(即路线)的位置,设置所需的自定义参数。在你的情况下,包括。它是这样的:
//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' }
});
}
});
在模型的适配器中读取此值以自定义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);
}
});
在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)
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));
}
});
}
});