首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ember {include: property}和Strongloop

Ember {include: property}和Strongloop
EN

Stack Overflow用户
提问于 2015-11-25 20:00:47
回答 1查看 196关注 0票数 0

好的,事情是这样的,当我深入挖掘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不会识别此请求。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2016-07-28 11:41:34

要将StrongLoop响应格式化为json:api,请安装优秀的loopback-component-jsonapi并使用以下命令创建一个server/component-config.json文件

代码语言:javascript
复制
{
  "loopback-component-jsonapi": {}
}

我喜欢驼峰式的Ember,所以我这样配置了ReST JSONAPIAdapter

代码语言:javascript
复制
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视频模型后,由于关系链接在响应中,因此您可以:

代码语言:javascript
复制
{{#each model.tags as |tag|}}
...
{{/each}}

当然,此方法将为每个标记发出单独的ajax请求--可能在某些情况下有效,但在其他情况下无效。

StrongLoop在json:api标准之前开发了他们的过滤器语法,所以它有一点不同。它们的筛选器必须包含filter查询参数键。我更喜欢使用json,因为它更容易阅读,并且可以很好地与Ember配合使用。

代码语言:javascript
复制
var query = {filter: {where: {createdBy:'starver', 
                              updatedBy:'service_acct'},
                      limit: 30
            }};
return this.store.query('mymodel', query);

如果你有查询参数传递到你的路由中,你可以在你的过滤器中传递use它们,假设它们被构造为使用loopback:

代码语言:javascript
复制
model(params) {
  var query = {filter: {where: params,
                        limit: 45
              }};
  return this.store.query('subscription', query);
}

侧向加载StrongLoop中的数据如下所示:

代码语言:javascript
复制
http://localhost:3000/api/subscriptions/1475?filter[include]=subscriptionStatus

在ember中,您可以将字符串作为查询传递,但是v2.7.0破坏了这一功能。有一个解决方法:在JSONAPIAdapter配置中禁用查询参数排序:

代码语言:javascript
复制
  // prevent the default implementation from turning a string into an array
  sortQueryParams: function(params) {
    return params;
  }

那么您的路由模型查询将如下所示:

代码语言:javascript
复制
return this.store.query('view', 'filter[include]=tag');

当作为对象传递时,jQuery会破坏更复杂的查询过滤器-它将过滤器对象分解成一系列对StrongLoop没有任何意义的过滤器查询参数。解决这个问题的一种方法是将您的查询过滤器形成为一个js对象,然后使用JSON.stringify()对其进行处理。

使用JSON.stringify()方法,将一个表中的数据包含到另一个表中的另一种方法是将该数据包含在响应的属性部分中。下面是一个来自工作代码的示例:

代码语言:javascript
复制
var query = {
  include: {
    relation: "subscriptionStatus",
    scope: {
      fields: ["subscriptionStatus"],
      where: {
        endDate: null
      }
    }
  },
  limit: 45
};
return this.store.query('subscription', 'filter=' + JSON.stringify(query));

这将生成一个属性部分,如下所示

代码语言:javascript
复制
"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 )

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33915990

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档