一、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.  最后,记得你可以结合QueriesFilter去利用各自的长处。记得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.Storepush或者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的更多相关文章

  1. tmux frequently asked questions

    tmux frequently asked questions How is tmux different from GNU screen?     tmux and GNU screen have ...

  2. 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 ...

  3. 06 Frequently Asked Questions (FAQ) 常见问题解答 (常见问题)

    Frequently Asked Questions (FAQ) Origins 起源 What is the purpose of the project? What is the history ...

  4. Frequently Asked Questions

    转自:http://www.tornadoweb.org/en/stable/faq.html Frequently Asked Questions Why isn’t this example wi ...

  5. 成员函数指针 C++ FAQ LITE — Frequently Asked Questions

    http://www.sunistudio.com/cppfaq/pointers-to-members.html C++ FAQ LITE — Frequently Asked Questions ...

  6. openvswith Frequently Asked Questions

    Open vSwitch <http://openvswitch.org> 参考地址:http://git.openvswitch.org/cgi-bin/gitweb.cgi?p=ope ...

  7. 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 ...

  8. Frequently Asked Questions - P-thresholds

    Source: http://mindhive.mit.edu/book/export/html 1. What is the multiple-comparison problem? What is ...

  9. 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 ...

随机推荐

  1. Python虚拟开发环境pipenv

    简介 requests库的作者,requests库的作者,requests库的作者(重要的事情说三遍)的又一力作,囊落了virtualenv, pip, pipfile等作为虚拟开发环境的命令行工具 ...

  2. 【CF671E】Organizing a Race 单调栈+线段树

    [CF671E]Organizing a Race 题意:n个城市排成一排,每个城市内都有一个加油站,赛车每次经过第i个城市时都会获得$g_i$升油.相邻两个城市之间由道路连接,第i个城市和第i+1个 ...

  3. node path的几个路径问题

    __dirname: 总是返回被执行的 js 所在文件夹的绝对路径 __filename: 总是返回被执行的 js 的绝对路径 process.cwd(): 总是返回运行 node 命令时所在的文件夹 ...

  4. 【转】UTF16和UTF8什么区别?

    这是一篇程序员写给程序员的趣味读物.所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级.整理这篇文章的动机是两个问题: 问题一: 使用Windows记事本的“另存为 ...

  5. numpy生成随机数组

    python想要生成随机数的话用使用random库很方便,不过如果想生成随机数组的话,还是用numpy更好更强大一点. 生成长度为10,在[0,1)之间平均分布的随机数组: rarray=numpy. ...

  6. 第一个springMVC入门程序

    先看下项目结构 要加载与spring相关的包 HelloController.java(注意是在包controller下) package controller; import org.springf ...

  7. 如何使QLineEdit禁止编辑

    在写程序的时候喜欢使用QLineEdit,用来显示打开文件的路径.但是很不喜欢被编辑.那么要怎么设置不可编辑呢. (1)调用lineEdit->setEnabled(False) #不可编辑了 ...

  8. Mongodb高级篇-性能优化

    1.监控 mongodb可以通过profile来监控数据,进行优化. 查看当前是否开启profile功能用命令:db.getProfilingLevel()返回level等级,值为0|1|2,分别代表 ...

  9. xtrabackup安装部署(二)

    在官网中,复制相关链接下载最新版本(建议使用当前发布版本前6个月左右的稳定版本) https://www.percona.com/downloads/XtraBackup/LATEST/ 1.下载和安 ...

  10. POJ 1964&HDU 1505&HOJ 1644 City Game(最大0,1子矩阵和总结)

    最大01子矩阵和,就是一个矩阵的元素不是0就是1,然后求最大的子矩阵,子矩阵里的元素都是相同的. 这个题目,三个oj有不同的要求,hoj的要求是5s,poj是3秒,hdu是1秒.不同的要求就对应不同的 ...