写点什么

Ember Data 之记录查询

用户头像
devpoint
关注
发布于: 刚刚
Ember Data 之记录查询

前面在《Ember.js 项目开发之 Ember Data》介绍了 Ember Data 和 《Ember Data 之模型定义》,本文将继续介绍记录操作。

记录检索

Ember Data 存储提供了一个接口,用于检索单一类型的记录。

检索单个记录

使用 store.findRecord() 是根据记录的类型和 ID 进行检索,通过返回一个 promise 处理满足检索条件的记录:


// GET /blog-posts/1this.store    .findRecord("blog-post", 1) // => GET /blog-posts/1    .then(function (blogPost) {        // 解析数据    });
复制代码


使用 store.peekRecord() 是根据记录的类型和 ID 进行,不会发出 HTTP 请求,只有当记录已经存在于 store 中时,才会被返回:


const blogPost = this.store.peekRecord("blog-post", 1); // => 没有HTTP请求
复制代码

检索多个记录

使用 store.findAll() 检索指定类型的所有记录:


// GET /blog-poststhis.store    .findAll("blog-post") // => GET /blog-posts    .then(function (blogPosts) {        // 解析记录数据    });
复制代码


使用store.peekall() 来检索已经加载到 store 中的指定类型的所有记录,而不需要发出 HTTP 请求:


const blogPosts = this.store.peekAll("blog-post"); // => 没有HTTP请求
复制代码


store.findAll() 返回一个满足条件的RecordArraystorePromiseArraystore.peekAll 则直接返回 RecordArray


需要注意的是 RecordArray 并不是一个 JavaScript 数组,它是一个实现 MutableArray 的对象。这是很重要的,因为,例如,如果想按索引检索记录,[] 符号将不起作用,必须使用 objectAt(index) 代替。

查询多条记录

Ember Data 提供了查询满足特定条件的记录的功能。调用 store.query() 将发出一个 GET 请求,并将传递的对象序列化为查询参数。这个方法与 findAll 一样返回一个PromiseArray


例如,下面在 person 模型中检索名字为 Peter 的人:


// GET to /persons?filter[name]=Peterthis.store    .query("person", {        filter: {            name: "Peter",        },    })    .then(function (peters) {        // 解析检索到的记录    });
复制代码

查询单条记录

如果使用的适配器支持能够返回单个模型对象的服务器请求,那么 Ember Data 提供了一种便捷的方法 store.queryRecord(),它将返回一个解析该单个记录的 promise 。请求是通过适配器定义的 queryRecord() 方法发出的。


例如,如果服务器 API 为当前登录的用户提供了一个端点app/adapters/user.js


// GET /api/current_user{    user: {        id: 6188,        username: "devpoint",    },};
复制代码


如果 User 模型的适配器定义了一个针对该端点的 queryRecord() 方法:


import Adapter from "@ember-data/adapter";import fetch from "fetch";
export default class UserAdapter extends Adapter { queryRecord(store, type, query) { return fetch("/api/current_user"); }}
复制代码


然后,调用 store.queryRecord() 将从服务器检索该对象:


store.queryRecord("user", {}).then(function (user) {    const username = user.get("username");    console.log(`Currently logged in as ${username}`);});
复制代码


store.query() 的情况一样,查询对象也可以传递给 store.queryRecord(),适配器的 queryRecord() 可以使用查询对象来限定请求。但是,适配器必须返回单个模型对象,而不是包含一个元素的数组,否则 Ember Data 将抛出异常。


需要注意,Ember 的默认 JSON:API adapter 没有提供直接支持 queryRecord() 所需的方法,因为它依赖于以数组形式返回结果数据的 REST 请求定义。


如果服务器 API 或适配器仅提供数组响应,但又希望只检索一条记录,也可以使用 query() 方法,如下所示:


如果服务器 API 或适配器仅提供数组响应,但是希望仅检索单个记录,则可以选择使用以下query()方法:


// GET to /users?filter[email]=quintiontang@gmail.comconst devpoint = store    .query("user", {        filter: {            email: "quintiontang@gmail.com",        },    })    .then(function (users) {        return users.get("firstObject");    });
复制代码

发布于: 刚刚阅读数: 2
用户头像

devpoint

关注

细节的追求者 2011.11.12 加入

专注前端开发,用技术创造价值!

评论

发布
暂无评论
Ember Data 之记录查询