2013-07-07 11 views
19

私は特定のビューで編集できるモデルを持っています。ただし、ビューの一番下には、すべての変更を保存または破棄するためのオプションが必要です。つまり、モデルに加えるすべての変更のリストを保存してから、「保存」ボタンをクリックした後で変更を加える必要があります。これは不必要に複雑に思えます。私はモデルのクローンを作成し、それをビュー内で変更する代替アプローチのアイデアを思いつきました。次に、ユーザーが「保存」をクリックすると、古いモデルを削除し、そのモデルを新しいモデルに置き換えます。そうでなければ、クローンモデルを破棄します。バックボーンでモデルをクローンする方法

これは許容されるアプローチですが、もしそうなら、どのようにしてクローニングプロセスを実装できますか?

これは、サーバーからデータを再度取得することと同じです(ただし、余分なHTTP要求は不要です)。

+1

なぜモデルをまったく複製する必要がありますか?とにかく、クリックして保存するとすべての値を抽出して保存できます。または保存中に値が変更されたかどうかを知りたい場合は 'Model View Binding'を実装してください。 – Pawan

答えて

25

cloneメソッドを使用できます。以下のショート例:あなたはBackbone.Mementoを試してみることができます

var Model = Backbone.Model.extend({}); 
var View = Backbone.View.extend({ 
    initialize: function() { 
     // save the attributes up front, removing references 
     this._modelAttributes = _.extend({}, this.model.attributes); 
    }, 
    onSave: function() { 
     // revert to initial state. 
     this.model.set(this._modelAttributes); 
    } 
}); 
+0

は' this.realModel.set(this.model.attributes); '間違いなく安全ですか?私はちょうど 'this'の値が異なっているかもしれないと思っています(私は'これは 'Backbone.Model'を両方とも意味していると思いますが、わかりません) –

+0

また、私の無知にも申し訳ありません。 'var Model = Backbone.Model.extend({});' - 'Model'をどこにでも使用することはありません。あるいは、単にインスタンスを作成したときに、モデルをモデルとして渡すことを提案しましたか? –

+0

私はモデルでビューを初期化する予定でしたが、私はそうしませんでした。おそらく、 'var Model'を無視することができます。 'this'は' this.realModel.set(this.model.attributes) 'は常に現在のコンテキストであるビューを参照します。 – kalley

0

var Model = Backbone.Model.extend({}); 
var View = Backbone.View.extend({ 
    initialize: function() { 
     this.realModel = this.model; 
     this.model = this.realModel.clone(); 
    }, 
    onSave: function() { 
     this.realModel.set(this.model.attributes); 
    } 
}); 

また少し違う何かを行うことができます。

使用しない場合は問題ありません。しかし、コードベースからどのように行うべきかについて、良い考えを得ることができます。

+0

上記のkalleyの方法でこれを使用する理由があるのですか、それとも代替手段を提供していますか? –

+0

いいえ、それは別の方法です。それは非常に小さく、他の機能の束を提供します。それが私が提案する理由です。 – Rifat

0

私は通常、この問題をビューのオブジェクトキャッシュで解決します。そうすれば、モデル/ビュー管理に不要なオーバーヘッドを追加することはありません。ユーザーが保存せずにビューを閉じた場合、破棄は自然に発生します。

var Model = Backbone.Model.extend({ 
    'title': 'Hello' 
}); 

var View = Backbone.View.extend({ 
    initialize: function() { 

     // Holds temporary values until save 
     this.cache = {}; 

    }, 
    onTitle: function() { 
     this.cache.title = 'World'; 
    }, 
    onSave: function() { 
     this.model.set(this.cache); 
    } 
}); 
関連する問題