英文原文:http://emberjs.com/guides/models/persisting-records/
Ember Data中的记录都基于实例来进行持久化。调用DS.Model实例的save()会触发一个网络请求,来进行记录的持久化。
下面是几个示例:
var post = store.createRecord('post', {title: 'Rails is Omakase',body: 'Lorem ipsum'});post.save(); // => POST to '/posts'
var post = store.find('post', 1);post.get('title') // => "Rails is Omakase"post.set('title', 'A new post');post.save(); // => PUT to '/posts/1'
承诺
save()会返回一个承诺,这使得可以非常容易的来处理保存成功和失败的场景。下面是一个通用的模式:
var post = store.createRecord('post', {title: 'Rails is Omakase',body: 'Lorem ipsum'});var 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
对于失败的网络请求,承诺也可以方便的来处理:
var post = store.createRecord('post', {title: 'Rails is Omakase',body: 'Lorem ipsum'});var onSuccess = function(post) {this.transitionToRoute('posts.show', post);};var onFail = function(post) {// deal with the failure here};post.save().then(onSuccess, onFail);// => POST to '/posts'// => transitioning to posts.show route
更多关于承诺的内容请参看这里,下面是一个示例展示了如何在重试失败的持久化操作:
function retry(callback, nTimes) {// if the promise failsreturn callback().fail(function(reason) {// if we haven't hit the retry limitif (nTimes-- > 0) {// retry again with the result of calling the retry callback// and the new retry limitreturn retry(callback, nTimes);}// otherwise, if we hit the retry limit, rethrow the errorthrow reason;});}// try to save the post up to 5 timesretry(function() {return post.save();}, 5);
