前面在《Ember.js 项目开发之 Ember Data》介绍了 Ember Data
和 《Ember Data 之模型定义》,《Ember Data 之记录查询》,本文将介绍记录操作:创建、更新和删除。
创建记录
可以通过调用 Store
中的createRecord()
方法来创建记录 。
store.createRecord('post', {
title: 'Rails is Omakase',
body: 'Lorem ipsum'
});
复制代码
可以在控制器和路由中使用store
对象this.store
。
更新记录
更改 Ember Data
记录就像设置要更改的属性一样简单:
this.store.findRecord('person', 1).then(function(tyrion) {
// ...after the record has loaded
tyrion.firstName = 'Yollo';
});
复制代码
持续记录
Ember Data
中的记录将按实例持久保存,调用 save()
的任何实例,Model
将发出网络请求。
Ember Data
会为跟踪每个记录的状态,保存时,这使 Ember Data
可以将新创建的记录与现有记录区别对待。
默认情况下,Ember Data
将 POST
新创建的记录添加到其类型 URL。
let post = store.createRecord('post', {
title: 'Rails is Omakase',
body: 'Lorem ipsum'
});
post.save(); // => POST to '/posts'
复制代码
后端已存在的记录使用 HTTP PATCH
动词更新。
store.findRecord('post', 1).then(function(post) {
post.title; // => "Rails is Omakase"
post.title = 'A new post';
post.save(); // => PATCH to '/posts/1'
});
复制代码
可以通过检查记录的hasDirtyAttributes
属性来判断记录是否有尚未保存的未完成的更改。还可以使用changedAttributes()
方法查看记录的哪些部分被更改了,以及原始值是什么。changedAttributes
返回一个对象,该对象的键是已更改的属性,值是一个值数组[oldValue, newValue]
。
person.isAdmin; // => false
person.hasDirtyAttributes; // => false
person.isAdmin = true;
person.hasDirtyAttributes; // => true
person.changedAttributes(); // => { isAdmin: [false, true] }
复制代码
此时,可以通过保留更改,save()
也可以回滚更改。调用 rollbackAttributes()
保存的记录将全部恢复changedAttributes
为原始值。如果有记录isNew
,它将从Store
中删除。
person.hasDirtyAttributes; // => true
person.changedAttributes(); // => { isAdmin: [false, true] }
person.rollbackAttributes();
person.hasDirtyAttributes; // => false
person.isAdmin; // => false
person.changedAttributes(); // => {}
复制代码
处理 Validation 错误
如果后端服务器在尝试保存后返回验证错误,则这些错误将在errors
模型的属性上可用。这是在博客模板中保存博客帖子时可能显示的错误的方式:
{{#each this.post.errors.title as |error|}}
<div class="error">{{error.message}}</div>
{{/each}}
{{#each this.post.errors.body as |error|}}
<div class="error">{{error.message}}</div>
{{/each}}
复制代码
Promises
save()
返回一个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
复制代码
删除记录
删除记录与创建记录一样简单。在模型的任何实例上调用deleteRecord()
,将记录标记为已删除。然后可以使用save()
持久化删除。或者,可以使用destroyRecord
方法同时删除和持久化。
let post = store.peekRecord('post', 1);
post.deleteRecord();
post.isDeleted; // => true
post.save(); // => DELETE to /posts/1
});
// OR
post = store.peekRecord('post', 2);
post.destroyRecord(); // => DELETE to /posts/2
});
复制代码
完
评论