En En

Поиск записей


Хранилище Ember Data предоставляет интерфейс для извлечения записей одного типа.

Извлечение одной записи

Используйте store.findRecord(), чтобы извлечь запись по ее типу и идентификатору. Этот код вернет обещание, которое будет разрешено с запрошенной записью:

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

Используйте store.peekRecord(), чтобы извлечь запись по ее типу и идентификатору без сетевого запроса. Этот код вернет запись, если она уже находится в хранилище:

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

Извлечение нескольких записей

Используйте store.findAll(), чтобы извлечь все записи данного типа:

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

Используйте store.peekAll(), чтобы без сетевого запроса извлечь все записи данного типа, которые уже загружены в хранилище:

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

store.findAll() возвращает DS.PromiseArray, которое разрешается с DS.RecordArray, а store.peekAll сразу возвращает DS.RecordArray.

Важно отметить, что DS.RecordArray — не массив JavaScript. Это объект, который реализует Ember.Enumerable. Это важно, так как если вы, например, хотите извлечь записи по индексу, обозначение [] не сработает. Вместо этого вам нужно будет использовать objectAt(index).

Запрос нескольких записей

Ember Data позволяет запрашивать записи, которые соответствуют определенному критерию. Вызов store.query() выполнит запрос GET с переданным объектом, сериализованным как параметры запросов. Этот метод возвращает DS.PromiseArray так же, как findAll.

Например, мы могли бы найти все модели person, которые имеют имя Peter, таким образом:

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

Запросы одной записи

Если вы используете адаптер, который поддерживает запросы к серверу, способные возвращать один объект модели, в Ember Data для вас есть удобный метод store.queryRecord(). Он вернет обещание, которое разрешается с одной записью. Запрос выполняется через метод queryRecord(), определенный адаптером.

Например, если ваш сервер приложений предоставляет конечную точку для только что вошедшего в систему пользователя:

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

и адаптер определяет для модели User метод queryRecord(), который охватывает эту конечную точку:

app/adapters/user.js

// app/adapters/user.js
import DS from "ember-data";

export default DS.Adapter.extend({
  queryRecord(modelName, 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 выбросит исключение.

Обратите внимание, что по умолчанию адаптер JSON API в Ember не предоставляет функциональность, необходимую для непосредственной поддержки queryRecord(), так как он полагается на стиль REST в определении запроса, согласно которому данные результата запроса возвращаются в форме массива.

Если ваш сервер приложений или адаптер предоставляют в ответ только массив, а вы хотите извлекать лишь одну запись, можно альтернативным образом использовать метод query():

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

Комментарии (0)

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.