创建记录
你可以调用store的createRecord()方法创建一条记录:
store.createRecord('post', {
title: 'Rails is Omakase',
body: 'Lorem ipsum'
});
在controller和route中可以通过this.get(‘store’)来获得store对象。
更新记录
更新一条记录,实际上是更新记录中属性的值:
this.get('store').findRecord('person', 1).then(function(tyrion) {
// ...after the record has loaded
tyrion.set('firstName', "Yollo");
});
Ember提供了很多的可以编辑记录的方法。比如,你可以使用Ember.object的incrementProperty方法:
person.incrementProperty('age'); // Happy birthday!
记录持久化
Ember Data对记录的持久化是基于对象实例。对每个模型实例调用save( ),都会发起一个网络请求。
Ember Data会精心的为你跟踪每条记录的状态。这使得Ember Data在保存记录时,对待新创建的记录方式会与已存在的记录不同。
默认的,Ember Data会在保存新创建的记录的时候发起一个post请求。
let post = store.createRecord('post', {
title: 'Rails is Omakase',
body: 'Lorem ipsum'
});
post.save(); // => POST to '/posts'
对于以存在的记录,Ember Data会通过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返回一个对象,这个对象key是发生变化的属性的名称,value是一个数组,它包括属性的原始值和更改后的值。
person.get('isAdmin'); //=> false
person.get('hasDirtyAttributes'); //=> false
person.set('isAdmin', true);
person.get('hasDirtyAttributes'); //=> true
person.changedAttributes(); //=> { isAdmin: [false, true] }
基于这一点,你即可以保存更新后的记录,也可以回滚你的记录到原始状态。调用rollbackAttributes()来回滚所有的变化过的属性。如果某条记录isNew为真,那么这条记录将被从store中移除。
person.get('hasDirtyAttributes'); //=> true
person.changedAttributes(); //=> { isAdmin: [false, true] }
person.rollbackAttributes();
person.get('hasDirtyAttributes'); //=> false
person.get('isAdmin'); //=> false
person.changedAttributes(); //=> {}
处理验证错误
如果当保存记录动作发生后,服务端传来了验证错误的信息,那么这个信息将会被收纳进模型的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}}
Promises
save( )返回一个promise对象,通过promise可以容易处理成功和失败的响应。下面是一个普通呃场景:
let post = store.createRecord('post', {
title: 'Rails is Omakase',
body: 'Lorem ipsum'
});
let 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
删除记录
删除记录跟创建记录一样简单。在DS.Model的实例上调用deleteRecord()即可。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()会自动的从适配器那里查找数据。
本节完