在 Ember.js 2.3 中,如何将 hasMany 异步调用编译为 ember 中的一个调用而不是多个调用
in Ember.js 2.3, how do I compile a hasMany async call into one call in ember instead of several?
我正在升级到ember-cli和ember 2.3。假设我有一个名为"用户"的模型和一个名为"发布"的模型,以及一个用户...
posts: DS.hasMany('post', {async:true})
现在,这按照我期望的方式工作,懒惰地加载数据并且不加载帖子,除非.js或模板中需要它。所以当我这样做时
{{#each user.posts as |post|}}
{{post.title}}
{{/each}}
我让每个帖子毫无问题地呈现其标题。但是,在我的服务器日志中,我看到以下内容:
GET /posts/2
GET /posts/7
GET /posts/13
其中数字是帖子 ID。这是意料之中的,因为当我从服务器返回用户实例时,我返回一个 id 列表作为参数 'posts'。因此,用户实例具有:
...
'posts': '2,7,13'
...
在其数据中。
现在我的问题是:当我使用 ember-data 1.0(pre ember-cli 和 pre ember 1.13)时,我记得对数据库的调用是为了同一个用例:
GET /posts?ids=2&7&13
或类似的东西。我不记得确切的格式,但是,我可以使用以下代码行访问服务器端的ID列表:
var ids = req.query.ids.toString();
这给了我一个逗号分隔的 ID 列表(字符串格式)。然后我会将其转换为 sql 语句
SELECT * from posts where id in (2,7,13)
我认为,这个SQL调用被解释为余烬端的manyArray,并且很容易像你期望的Ember Array那样运行。
我怎样才能让这种情况再次发生?我很有信心我错过了一些东西,我不必"破解"余烬数据;我非常想将这些调用压缩为一个,而不是为每个"帖子"单独调用数据库。
我还应该提到,我不想为这些调用制作{async:false}。
我认为您正在寻找的东西是coalesceFindRequests
,这是适配器上的设置,用于告诉Ember将同一运行循环中发生的多个请求捆绑成一个GET请求,就像您过去一样。
您可以在此处查看更多详细信息,但基本上您需要做的就是将以下内容添加到您的应用程序适配器(为所有类型的所有请求启用它)或您的帖子适配器(以便它仅影响发布请求)
如果您为文件使用 pod 结构,这里有一个例子(我推荐)
// app/application/adapter.js
import DS from 'ember-data';
export default DS.JSONAPIAdapter.extend({
coalesceFindRequests: true
})
- 从全局函数调用Ember控制器上的方法
- 加载Ember.js后调用函数
- Ember.js-模型find()方法中的异步调用
- Ember 1.10-升级错误-模板必须是一个函数.您是想调用Ember.Handlebars.compile(“..”
- 未捕获错误:在未加载模板编译器的情况下,无法调用“compile”.请在调用“compile”之前加载“ember te
- 如何在Ember中转换到另一个路由时调用一个方法
- Ember添加了对转换调用上下文(路由/控制器)的检查
- Ember与videoJS函数调用
- 父操作可防止在 ember.js 中调用提交操作
- Ember数据FixtureAdapter hasmany-无法调用方法'toString'的未定义
- Ember.js - 在车把内初始化的视图中调用方法
- 在 Ember.js 2.3 中,如何将 hasMany 异步调用编译为 ember 中的一个调用而不是多个调用
- Ember.js在哪里调用 this._super()
- 在 {{#each}} 之后调用代码已在 ember.js 中呈现
- 如何使 ember 组件从服务器获取数据.将 AJAX 调用放在组件中似乎不是处理此问题的好做法
- ember - 控制器操作仅由输入字段调用,而不由按钮调用
- 如何将模板与加载了从 ember.js 中的调用模板传递的数据的文本框一起使用
- 绑定此内容以供以后在 Ember 中调用的方法
- 将ajax调用的响应存储在ember中
- 从iframe中的纯JavaScript调用Ember动作