#3 查询记录

来源:互联网 发布:海宁网络招聘 编辑:程序博客网 时间:2024/05/22 17:05

英文原版:https://guides.emberjs.com/v2.14.0/models/finding-records/

Ember Data的store提供了一个接口用来检索某个类型的记录。

检索单条记录

使用store.findRecord()来通过type和id来检索一条记录。这将会返回一个带有记录数据的promise对象。

let blogPost = this.get('store').findRecord('blog-post', 1); // => GET /blog-posts/1

使用store.peekRecord()通过type和id来检索一条记录,这时并不会产生网络请求。它仅仅从store中检索该记录。

let blogPost = this.get('store').peekRecord('blog-post', 1); // => no network request

检索多条记录

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

let blogPosts = this.get('store').findAll('blog-post'); // => GET /blog-posts

使用store.peekAll()来检索已经在本地store中的所有记录:

let blogPosts = this.get('store').peekAll('blog-post'); // => no network request

store.findAll()会返回一个包含DS.RecordArray对象的DS.PromiseArray对象;store.peekAll( )直接返回DS.RecordArray对象。

需要注意的是,DS.RecordArray不是javascript原生数组,它是一个实现了Ember.Enumerable的对象。它重要是因为,如果你想通过索引值index来检索数据的时候,直接通过[ ]数组符号是不行,你必须使用objectAt(index)方法

查询多条记录

Ember Data提供了查询记录的能力。调用store.query()将会发送一个GET请求,并可以携带查询参数。该方法同findAll( )一样,将返回DS.PromiseArray对象。

比如,可以查询名字是Peter的所有person模型:

// GET to /persons?filter[name]=Peterthis.get('store').query('person', {  filter: {    name: 'Peter'  }}).then(function(peters) {  // Do something with `peters`});

查询单条记录

如果你的适配器(adapter)支持能够返回单个模型对象的服务器请求,Ember Data提供的store.queryRecord()将会返回带有这个单条记录的promise对象。这个请求通过在适配器中定义的queryRecord( )被发出。

例子,服务器提供了返回当前已登陆的用户的接口:

// GET /api/current_user{  user: {    id: 1234,    username: 'admin'  }}

对应于User模型的适配器定义了一个queryRecord() 方法:

app/adapters/user.jsimport DS from "ember-data";export default DS.Adapter.extend({  queryRecord(store, type, query) {    return Ember.$.getJSON("/api/current_user");  }});

然后,调用store.queryRecord()将会从服务器查询该记录:

store.queryRecord('user', {}).then(function(user) {  let username = user.get('username');  console.log(`Currently logged in as ${username}`);});

就像使用store.query()一样,也可以给store.queryRecord()中传递查询参数,并且这个参数对适配器中的queryRecord()也有效。这时候适配器必须返回一个单独的模型对象,返回一个带有单个模型对象的数组也是不允许的,否则Ember Data会抛出异常。

注意,Ember内置的JSON API adapter 并没有直接提供对queryRecord()方法的支持,它基于REST风格的请求并且返回数组形式的结果。

如果你的服务器接口或者适配器只接受数组形式的返回数组,但是你希望只检索单条记录,你或许可以使用query()来作为替代方案:

// GET to /users?filter[email]=tomster@example.comtom = store.query('user', {  filter: {    email: 'tomster@example.com'  }}).then(function(users) {  return users.get("firstObject");});

本节完

原创粉丝点击