22

特定のビューで編集できるモデルがあります。ただし、ビューの下部で、ユーザーはすべての変更を保存または破棄するオプションを取得する必要があります。これは、モデルに加えるすべての変更のリストを保存し、[保存] ボタンをクリックしてから変更を加える必要があることを意味します。これは不必要に複雑に聞こえるので、モデルのクローンを作成し、ビュー内のクローンを変更するという代替アプローチのアイデアを思いつきました。次に、ユーザーが「保存」をクリックすると、古いモデルが削除され、コレクション内の新しいモデルに置き換えられます。それ以外の場合は、複製されたモデルを破棄します。

これは許容できるアプローチですが、そうであれば、クローン作成プロセスをどのように実装できますか?

これは、サーバーからデータを再度フェッチすることと同じです (ただし、追加の HTTP 要求は不要のようです)。

4

3 に答える 3

28

メソッドを使用できますclone。以下の短い例:

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);
    }
});

少し違うことをすることもできます:

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);
    }
});
于 2013-07-07T22:39:53.070 に答える
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 );
    }
});
于 2014-03-17T18:14:57.507 に答える
0

Backbone.Mementoを試すことができます。

使いたくなければ問題ありません。しかし、コードベースからどのように行うべきかについて良いアイデアを得ることができます.

于 2013-07-08T01:49:33.380 に答える