前面在《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; // => falseperson.hasDirtyAttributes; // => falseperson.isAdmin = true;person.hasDirtyAttributes; // => trueperson.changedAttributes(); // => { isAdmin: [false, true] }
复制代码
此时,可以通过保留更改,save()也可以回滚更改。调用 rollbackAttributes() 保存的记录将全部恢复changedAttributes为原始值。如果有记录isNew,它将从Store中删除。
person.hasDirtyAttributes; // => trueperson.changedAttributes(); // => { isAdmin: [false, true] }
person.rollbackAttributes();
person.hasDirtyAttributes; // => falseperson.isAdmin; // => falseperson.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});
复制代码
完
评论