7.12 Models -- Frequently Asked Questions
一、Should I use a query or a filter to seach records?我应该使用一个查询或者过滤器来搜索记录吗?
这取决于你想要搜索多少reocrds并且它们是否被加载到store中了。
1. Queries
(1) Queries对于搜索数百,数千,或者甚至百万的记录是有用的。你仅仅把搜索选项交给你的服务器,并且它负责把匹配的records列表交还给你。因为来自服务器的响应包含所有匹配的records的ID,这并不重要,如果store没有提前加载它们;它认为它们不在缓存中并且如果必要的话可以通过ID请求record。
(2) Queries的缺点是它们不是实时更新的,它们比较慢,并且它们要求你的服务器支持你希望执行的查询类型。
(3) 因为是服务器决定哪些records匹配这个查询,而不是store,Queries不实时更新。如果你希望更新它们,你必须手动调用reload()方法并且等待服务器响应。如果你在客户端创建了一个新的record,它将不会显示在结果中直到你存储这条新的record到服务器并且重新加载查询结果。
(4) 因为store必须与你的服务器协商来决定一个查询的结果,它需要一个网络请求。这对用户来说很慢,特别是如果他们是在一个很慢的连接上或者你的服务器响应很慢。当必须咨询服务器时,JS Web应用程序的典型速度可以提高迟钝的感觉。
(5) 最后,执行查询要求store和服务期间协作。默认的,Ember Data将会发送search options,你把它们作为HTTP请求体传递到你的服务器。如果你的服务器不支持这种格式的请求,你要么需要更改你的服务器,要么通过创建自定义的适配器来自定义查询如何被发送。
2. Filter
(1) 过滤器,在另一方面,是在store的缓存中执行一个关于所有records的实时搜索。一旦一条新的record被加载进store,这个filter将会检查这条record是否匹配,如果匹配,就把它添加进搜索结果的数组中。如果这个数组被展现在一个模板中,模板会自动更新。
(2) 过滤器还考虑到新创建的并且没有被保存进store的records,并且records已经被修改但是没有被保存。如果你希望records显示在搜索结果中一旦它们在客户端被创建或者被修改,你应该使用一个过滤器。
(3) 切记如果store不知道它们,records不会显示在一个过滤器中。你可以通过使用store的push()方法确保一条record在store中。
(4) 还有一个限制,在你遇到性能问题之前你可以在内存中合理的保存和搜索多少records。
3. 最后,记得你可以结合Queries和Filter去利用各自的长处。记得records通过一个query返回到服务器并且缓存进store。你可以使用这个事实来执行一个filter,通过一个query,开始匹配record到store中,并且一个filter function匹配相同的records。
4. 这将卸载服务器搜索所有可能的records,同时仍然创建一个实时更新列表,它包含了在客户端创建的和修改records。
app/routes/posts/favourited.js
export default Ember.Route.extend({
model() {
var store = this.store; // Create a filter for all favorited posts that will be displayed in
// the template. Any favorited posts that are already in the store
// will be displayed immediately;
// Kick off a query to the server for all posts that
// the user has favorited. As results from the query are
// returned from the server, they will also begin to appear.
return store.filter('post', { favorited: true }, function(post) {
return post.get('isFavorited');
});
}
});
二、How do I inform Ember Data about new records created on the backend?我如何通知Ember Data在后台创建的新记录?
1. 当你通过使用Ember Data的store.findRecord方法请求一个record时,Ember将会自动把数据加载进store。对于已经请求过的数据,这允许Ember避免下一次到后台的往返造成的延迟。另外,加载一条record进store将会更新任何RecordArray(例如store.filter或者store.findAll的结果),应该包含这条record。这意味着任何依据RecordArray的绑定的数据或者计算属性将会自动被同步,去包含这条新的或者更新的record的值。
2. 一些应用程序可能希望不通过store.findeRecord请求record添加或者更新record到store。为了完成这个要求,你可以使用DS.Store的push或者pushPayload方法。对于有一个通道(例如 SSE或者 Web Sockets)去通知它后台有新的或者更新的recordsweb的应用程序,这是有用的。
3. 在Ember Data的store中,push是最简单的方法去加载或者更新records。当使用push的时候,在把record推送进store之前规范化(normalize)JSON对象很重要。
4. push一次只接收一条record。如果你想加载一个records数组到store你可以调用pushMany。
socket.on('message', function (message) {
var modelName = message.model;
store.push(modelName, store.normalize(modelName, message.data));
});
5. 作为v1.0.0-beta.14的push方法,它接受部分属性去更新存在的records。因此启用更新方法。更新部分属性是有用的,如果你的网络应用程序只接收到一个模型的改变属性的通知。
6. pushPayload对于store#push来说是一个方便的封装,如果模型的序列化器实现一个pushPayload
方法吗,它将反序列化payloads。
注意这个方法和JsonSerializer一起工作不会有效,因为它没有实现一个pushPayload方法,这个非常重要。
socket.on('message', function (message) {
store.pushPayload(message.model, message.data);
});
7.12 Models -- Frequently Asked Questions的更多相关文章
- tmux frequently asked questions
tmux frequently asked questions How is tmux different from GNU screen? tmux and GNU screen have ...
- Relinking Oracle Home FAQ ( Frequently Asked Questions) (Doc ID 1467060.1)
In this Document Purpose Questions and Answers 1) What is relinking ? 2) What is relinking ...
- 06 Frequently Asked Questions (FAQ) 常见问题解答 (常见问题)
Frequently Asked Questions (FAQ) Origins 起源 What is the purpose of the project? What is the history ...
- Frequently Asked Questions
转自:http://www.tornadoweb.org/en/stable/faq.html Frequently Asked Questions Why isn’t this example wi ...
- 成员函数指针 C++ FAQ LITE — Frequently Asked Questions
http://www.sunistudio.com/cppfaq/pointers-to-members.html C++ FAQ LITE — Frequently Asked Questions ...
- openvswith Frequently Asked Questions
Open vSwitch <http://openvswitch.org> 参考地址:http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=ope ...
- Kafka Frequently Asked Questions
This is intended to be an easy to understand FAQ on the topic of Kafka. One part is for beginners, o ...
- Frequently Asked Questions - P-thresholds
Source: http://mindhive.mit.edu/book/export/html 1. What is the multiple-comparison problem? What is ...
- NFC Forum : Frequently Asked Questions (NFC 论坛:FAQ)
NFC for Business What is the NFC Forum? The NFC Forum is a not-for-profit industry organization whos ...
随机推荐
- linux 简单搭建git服务器
如果使用git的人数较少,可以使用下面的步骤快速部署一个git服务器环境. 1. 生成 SSH 公钥 每个需要使用git服务器的工程师,自己需要生成一个ssh公钥进入自己的~/.ssh目录,看有没有用 ...
- 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十八:SDRAM模块① — 单字读写
实验十八:SDRAM模块① — 单字读写 笔者与SDRAM有段不短的孽缘,它作为冤魂日夜不断纠缠笔者.笔者尝试过许多方法将其退散,不过屡试屡败的笔者,最终心情像橘子一样橙.<整合篇>之际, ...
- Asp.Net MVC WebApi2 自动生成帮助文档
WebAPI Help文档配置 开发环境VS2013+mvc5+WebApi2 一.通过NuGet引用Web API Test Client 安装后会多一个Areas文件夹 二.设置xml文档项目-- ...
- ios atomic nonatomic区别
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作. atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全 ...
- 解决jenkins下使用HTML Publisher插件后查看html报告显示不正常
在jenkins后使用html publisher查看html报告时,发现显示不全,很多东西显示不了. 在查看官方文档后,这原来是安全问题所导致的. Jenkins安全默认是将以下功能都关闭了 1.j ...
- LCA最近公共祖先(least common ancestors)
#include"stdio.h" #include"string.h" #include"iostream" #include" ...
- [CentOS_7.4]Linux安装与网络配置
一 安装 官网下载ISO安装文件:https://www.centos.org/download/ 然后自行安装. 二 配置网络 a.配置动态ip 1 2 3 1)# vi /etc/sysconfi ...
- C语言清屏函数
Devc++ 与VC中的清屏函数 #include<stdio.h> #include<stdlib.h>//清屏函数的头文 int main() { int i; for(i ...
- POJ-2356 Find a multiple(DFS,抽屉原理)
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7133 Accepted: 3122 Speci ...
- jupyter notebook快捷键速查手册
jupyter notebook快捷键速查手册 Enter : 转入编辑模式 Shift-Enter : 运行本单元,选中下个单元 Ctrl-Enter : 运行本单元 Alt-Enter : 运行本 ...