En En

Создание, обновление и удаление


Создание записей

Вы можете создавать записи с помощью вызова метода createRecord() в хранилище.

store.createRecord('post', {
  title: 'Rails is Omakase',
  body: 'Lorem ipsum'
});

Объект хранилища доступен в контроллерах и маршрутах через this.get('store').

Обновление записей

Чтобы вносить изменения в записи Ember Data, можно просто установить атрибут, который вы хотите изменить:

this.get('store').findRecord('person', 1).then(function(tyrion) {
  // ...after the record has loaded
  tyrion.set('firstName', "Yollo");
});

Все полезные возможности Ember.js доступны для изменения атрибутов. Например, вы можете использовать хелпер incrementProperty от Ember.Object:

person.incrementProperty('age'); // Happy birthday!

Сохранение записей

Записи в Ember Data сохраняются на основе экземпляра. Вызовите save() на любом экземпляре DS.Model, и он сделает сетевой запрос.

Ember Data отслеживает для вас состояние каждой записи. Это позволяет Ember Data при сохранении по-разному обрабатывать только что созданные и существующие записи.

По умолчанию Ember Data будет POST (располагать) только что созданные записи по их типу URL.

var post = store.createRecord('post', {
  title: 'Rails is Omakase',
  body: 'Lorem ipsum'
});

post.save(); // => POST to '/posts'

Записи, которые уже существуют в backend'е, обновляются с помощью команды HTTP PATCH.

store.findRecord('post', 1).then(function(post) {
  post.get('title'); // => "Rails is Omakase"

  post.set('title', 'A new post');

  post.save(); // => PATCH to '/posts/1'
});

Проверив свойство hasDirtyAttributes у записи, вы можете узнать, есть ли у нее важные изменения, которые еще не сохранены. Вы также можете посмотреть, какие части записи были изменены и какое исходное значение использовал метод changedAttributes(). changedAttributes возвращает объект, чьи ключи — измененные свойства, а значения — массив значений [oldValue, newValue].

person.get('isAdmin');            //=> false
person.get('hasDirtyAttributes'); //=> false
person.set('isAdmin', true);
person.get('hasDirtyAttributes'); //=> true
person.changedAttributes();       //=> { isAdmin: [false, true] }

Сейчас вы можете сохранить изменения через save() или откатить их назад. Вызов rollbackAttributes() для сохраненной записи возвращает все changedAttributes к их исходному значению. Если запись isNew, то она будет удалена из хранилища.

person.get('hasDirtyAttributes'); //=> true
person.changedAttributes();       //=> { isAdmin: [false, true] }

person.rollbackAttributes();

person.get('hasDirtyAttributes'); //=> false
person.get('isAdmin');            //=> false
person.changedAttributes();       //=> {}

Обработка ошибок подтверждения данных

Если backend-сервер после попытки сохранения возвращает ошибки подтверждения данных, они будут доступны в свойстве errors вашей модели. Вот так вы можете отобразить ошибки сохранения публикации блога в шаблоне:

{{#each post.errors.title as |error|}}
  <div class="error">{{error.message}}</div>
{{/each}}
{{#each post.errors.body as |error|}}
  <div class="error">{{error.message}}</div>
{{/each}}

Обещания

save() возвращает обещание, которое упрощает асинхронную обработку сценариев неудачи и успеха. Вот общий паттерн:

var post = store.createRecord('post', {
  title: 'Rails is Omakase',
  body: 'Lorem ipsum'
});

var self = this;

function transitionToPost(post) {
  self.transitionToRoute('posts.show', post);
}

function failure(reason) {
  // handle the error
}

post.save().then(transitionToPost).catch(failure);

// => POST to '/posts'
// => transitioning to posts.show route

Удаление записей

Удаление записей происходит так же просто, как их создание. Вызовите deleteRecord() на любом экземпляре DS.Model. Таким образом вы помечаете запись как isDeleted. Удаление затем можно сохранить с помощью save(). В качестве альтернативы вы можете использовать метод destroyRecord, чтобы сразу удалять и сохранять.

store.findRecord('post', 1, { backgroundReload: false }).then(function(post) {
  post.deleteRecord();
  post.get('isDeleted'); // => true
  post.save(); // => DELETE to /posts/1
});

// OR
store.findRecord('post', 2, { backgroundReload: false }).then(function(post) {
  post.destroyRecord(); // => DELETE to /posts/2
});

Опция backgroundReload используется, чтобы предотвратить извлечение удаленной записи, так как findRecord() автоматически планирует извлечение записи из адаптера.


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

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