#4 创建、更新和删除

创建记录

你可以调用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()会自动的从适配器那里查找数据。

本节完

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值