当前位置: 首页 > news >正文

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.  最后,记得你可以结合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);
});

转载于:https://www.cnblogs.com/sunshineground/p/5165994.html

相关文章:

  • Mysql错误问题记录
  • PostgreSQL wal receiver 统计信息 patch
  • 【COCOS CREATOR 系列教程之四】基于0.7.1先简单制作一个PAGEVIEW
  • 两列自适应布局方案整理
  • 在.net桌面程序中自定义鼠标光标
  • Beanstalkd中文协议解读
  • windows ping RPi 2B
  • BLE4.0相关
  • Steve Souders 高性能网站建设指南14条提升网站页面速度的最佳实践(1)
  • 生成日期序列
  • jQuery UI dialog插件出错信息:$(this).dialog is not a function
  • SPOJ QTREE4 lct
  • 2014 I/O归来:Google连接一切
  • kvm虚拟化技术中虚拟机vcpu与物理cpu绑定
  • YMP开发框架快速上手(一)
  • CentOS7简单部署NFS
  • HTTP--网络协议分层,http历史(二)
  • JavaScript中的对象个人分享
  • Java读取Properties文件的六种方法
  • JAVA多线程机制解析-volatilesynchronized
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MySQL用户中的%到底包不包括localhost?
  • python学习笔记 - ThreadLocal
  • Redis 中的布隆过滤器
  • 回顾2016
  • 机器学习 vs. 深度学习
  • 排序算法学习笔记
  • 数据可视化之 Sankey 桑基图的实现
  • 项目管理碎碎念系列之一:干系人管理
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • #vue3 实现前端下载excel文件模板功能
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (篇九)MySQL常用内置函数
  • (顺序)容器的好伴侣 --- 容器适配器
  • (一)appium-desktop定位元素原理
  • .gitignore文件_Git:.gitignore
  • .gitignore文件---让git自动忽略指定文件
  • .NET Standard 的管理策略
  • .Net 垃圾回收机制原理(二)
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • /proc/vmstat 详解
  • @property python知乎_Python3基础之:property
  • @Service注解让spring找到你的Service bean
  • []常用AT命令解释()
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [AIGC] MySQL存储引擎详解
  • [ajaxupload] - 上传文件同时附件参数值
  • [Android]使用Retrofit进行网络请求