2011-06-28 7 views
23

私は自分のページに「サーバーからロードされた状態に戻ったすべての変更を元に戻す」ボタンを持っています。backbone.jsモデルの変更をロールバックする方法は?

私はBackbonejsモデルの初期状態を保存し、現在の(変更された)状態を初期状態に戻す。

これを達成する最も良い方法は何ですか?

はあなたに私がその編集前の状態にモデルを戻すための単一のメソッド呼び出しがあると信じていけない

答えて

11

FWIW私は、特に念頭に置いて、「キャンセル」ボタンのアイデアを、これを自動的に処理するためのプラグインを書きました新しい値(何も変更されていない場合はfalse)。つまり、あなたのプロトタイプでcancelChanges方法書くためにそれらを組み合わせることができ:NYTimesのbackbone.trackitを見てみましょう

var RollbackEnabledModel = Backbone.Model.extend({ 
    initialize: function() { 
    this._initAttributes = _.clone(this.attributes); 
    }, 
    parse: function(data) { 
    this._initAttributes = _.clone(data); 
    return data; 
    }, 
    rollback: function() { 
    this.set(this._initAttributes); 
    } 
}); 
+0

ありがとうございます。この文章に誤字がありますか? "modelbindingファイルをbackbone.jsファイルの後ろに含めてください。"、ここでmodelbindingはmementoを読み込むべきですか? – archmage

+0

おっと!はい、コピー&ペーストエラー:P –

+0

backbone.mementoはバックボーン1.1でもまだ使えますか?私は最後のコミットが2012年に行われていることを確認します。 – Roberto

8

ありがとうございました..しかし、未編集の値を個別にmodel.previous(属性)を介して一括しmodel.previousAttributesを経由してご利用いただけます。 model.changedAttributes()戻って変更されたすべての属性しばらく、しかしで、http://github.com/derickbailey/backbone.memento

7

model.previousAttributes()戻り、以前の属性のすべて: -

2

を私が思い付いたものです。 model.changedAttributes()model.previousAttributes()のような最新の変更だけでなく、モデルの複数の変更を追跡します。 READMEから:

var model = new Backbone.Model({id:1, artist:'Samuel Beckett', 'work':'Molloy'}); 
model.startTracking(); 

model.set('work', 'Malone Dies'); 
console.log(model.unsavedAttributes()); // >> Object {work: "Malone Dies"} 

model.set('period', 'Modernism'); 
console.log(model.unsavedAttributes()); // >> Object {work: "Malone Dies", period: "Modernism"} 

model.save({}, { 
    success: function() { 
     console.log(model.unsavedAttributes()); // >> false 
    } 
}); 

また、ライブラリには、最後の保存以降 元の状態にresetAttributesに機能を追加するunsavedChangesの 状態が更新されたイベントをトリガし、に選ぶためのオプションがあります 新しいコンテキストにルーティングする前に確認を促すメッセージ。

0

:ここ

var MyModel = Backbone.Model.extend({ 
    cancelChanges: function() { 
     var changed = this.changedAttributes(); 

     if(!changed) 
      return; 

     var keys = _.keys(changed); 
     var prev = _.pick(model.previousAttributes(), keys); 

     this.set(prev, {silent: true}); // "silent" is optional; prevents change event 
    }, 

}); 
関連する問題