#4 创建、更新和删除

来源:互联网 发布:360域名举报 编辑:程序博客网 时间:2024/05/17 07:41

创建记录

你可以调用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');            //=> falseperson.get('hasDirtyAttributes'); //=> falseperson.set('isAdmin', true);person.get('hasDirtyAttributes'); //=> trueperson.changedAttributes();       //=> { isAdmin: [false, true] }

基于这一点,你即可以保存更新后的记录,也可以回滚你的记录到原始状态。调用rollbackAttributes()来回滚所有的变化过的属性。如果某条记录isNew为真,那么这条记录将被从store中移除。

person.get('hasDirtyAttributes'); //=> trueperson.changedAttributes();       //=> { isAdmin: [false, true] }person.rollbackAttributes();person.get('hasDirtyAttributes'); //=> falseperson.get('isAdmin');            //=> falseperson.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});// ORstore.findRecord('post', 2, { backgroundReload: false }).then(function(post) {  post.destroyRecord(); // => DELETE to /posts/2});

backgroundReload选项用来阻止对该数据的重新读取,因为findRecord()会自动的从适配器那里查找数据。

本节完

原创粉丝点击