好的,事情是这样的,当我深入挖掘Ember和StrongLoop集成的时候,我发现把它们连接起来越来越困难。
我现在有以下问题。StrongLoop不会返回基于JSONAPI格式的模型关系,所以如果我的video模型与tag模型有hasMany关系,那么在我的响应中将不会有这里指定的include数组:JSON API docs。
所以我不得不在这里选择:要么是发出2个请求的async: true,这是不可取的,要么是向请求传递一个筛选器参数,比如:
return this.store.queryRecord('video', {'include': 'tag'});会向/videos?include=tag发送请求,但StrongLoop不会识别此请求。
有什么想法吗?
发布于 2016-07-28 11:41:34
要将StrongLoop响应格式化为json:api,请安装优秀的loopback-component-jsonapi并使用以下命令创建一个server/component-config.json文件
{
"loopback-component-jsonapi": {}
}我喜欢驼峰式的Ember,所以我这样配置了ReST JSONAPIAdapter
import Ember from 'ember';
export default DS.JSONAPIAdapter.extend({
// Where our API lives on our URI
namespace: 'api',
// change default from dasherize to camelize
pathForType(type) {
var camelized = Ember.String.camelize(type);
return Ember.String.pluralize(camelized);
}
});将tags: hasMany('tag')添加到Ember视频模型后,由于关系链接在响应中,因此您可以:
{{#each model.tags as |tag|}}
...
{{/each}}当然,此方法将为每个标记发出单独的ajax请求--可能在某些情况下有效,但在其他情况下无效。
StrongLoop在json:api标准之前开发了他们的过滤器语法,所以它有一点不同。它们的筛选器必须包含filter查询参数键。我更喜欢使用json,因为它更容易阅读,并且可以很好地与Ember配合使用。
var query = {filter: {where: {createdBy:'starver',
updatedBy:'service_acct'},
limit: 30
}};
return this.store.query('mymodel', query);如果你有查询参数传递到你的路由中,你可以在你的过滤器中传递use它们,假设它们被构造为使用loopback:
model(params) {
var query = {filter: {where: params,
limit: 45
}};
return this.store.query('subscription', query);
}侧向加载StrongLoop中的数据如下所示:
http://localhost:3000/api/subscriptions/1475?filter[include]=subscriptionStatus在ember中,您可以将字符串作为查询传递,但是v2.7.0破坏了这一功能。有一个解决方法:在JSONAPIAdapter配置中禁用查询参数排序:
// prevent the default implementation from turning a string into an array
sortQueryParams: function(params) {
return params;
}那么您的路由模型查询将如下所示:
return this.store.query('view', 'filter[include]=tag');当作为对象传递时,jQuery会破坏更复杂的查询过滤器-它将过滤器对象分解成一系列对StrongLoop没有任何意义的过滤器查询参数。解决这个问题的一种方法是将您的查询过滤器形成为一个js对象,然后使用JSON.stringify()对其进行处理。
使用JSON.stringify()方法,将一个表中的数据包含到另一个表中的另一种方法是将该数据包含在响应的属性部分中。下面是一个来自工作代码的示例:
var query = {
include: {
relation: "subscriptionStatus",
scope: {
fields: ["subscriptionStatus"],
where: {
endDate: null
}
}
},
limit: 45
};
return this.store.query('subscription', 'filter=' + JSON.stringify(query));这将生成一个属性部分,如下所示
"attributes": {
"createdBy": "services",
"createdTs": "2016-07-27T21:37:50.000Z",
"updatedBy": "services",
"updatedTs": "2016-07-27T21:58:04.000Z",
"version": 9,
"certificateId": 1,
"backupTime": "0:0",
"backupRetentionDays": 1,
"subscriptionStatus": [
{
"subscriptionStatus": "TERMINATED",
"subscriptionId": 1475
}
]
},这很有趣,但在ember约定中出现了一些名称冲突问题。
这是一个相当古老的问题,但它可能会帮助那些正在与这些问题作斗争的人。
StrongLoop查询文档:https://docs.strongloop.com/display/public/LB/Querying+data#Queryingdata-UsingstringifiedJSONinRESTqueries
注意:我使用的是loopback v2.14.0,ember v2.7.0 (也适用于2.5,2.6 )
https://stackoverflow.com/questions/33915990
复制相似问题