1、Should I use a query or a filter to seach records?我应该使用一个查询或者过滤器来搜索记录吗?html
这取决于你想要搜索多少reocrds而且它们是否被加载到store中了。html5
1. Queriesweb
(1) Queries对于搜索数百,数千,或者甚至百万的记录是有用的。你仅仅把搜索选项交给你的服务器,而且它负责把匹配的records列表交还给你。由于来自服务器的响应包含全部匹配的records的ID,这并不重要,若是store没有提早加载它们;它认为它们不在缓存中而且若是必要的话能够经过ID请求record。api
(2) Queries的缺点是它们不是实时更新的,它们比较慢,而且它们要求你的服务器支持你但愿执行的查询类型。数组
(3) 由于是服务器决定哪些records匹配这个查询,而不是store,Queries不实时更新。若是你但愿更新它们,你必须手动调用reload()方法而且等待服务器响应。若是你在客户端建立了一个新的record,它将不会显示在结果中直到你存储这条新的record到服务器而且从新加载查询结果。缓存
(4) 由于store必须与你的服务器协商来决定一个查询的结果,它须要一个网络请求。这对用户来讲很慢,特别是若是他们是在一个很慢的链接上或者你的服务器响应很慢。当必须咨询服务器时,JS Web应用程序的典型速度能够提升迟钝的感受。服务器
(5) 最后,执行查询要求store和服务期间协做。默认的,Ember Data将会发送search options,你把它们做为HTTP请求体传递到你的服务器。若是你的服务器不支持这种格式的请求,你要么须要更改你的服务器,要么经过建立自定义的适配器来自定义查询如何被发送。websocket
2. Filter网络
(1) 过滤器,在另外一方面,是在store的缓存中执行一个关于全部records的实时搜索。一旦一条新的record被加载进store,这个filter将会检查这条record是否匹配,若是匹配,就把它添加进搜索结果的数组中。若是这个数组被展示在一个模板中,模板会自动更新。app
(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'); }); } });
2、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); });