2012-02-09 5 views
16

私はバックボーンモデルを持っています。 model.set()では、model.save()を使用してローカル値を設定できます。モデル全体をサーバーに保存できます。backbone.js:最後のサーバー保存以降に変更がありますか?

最後のサーバーセーブ以降に変更があったかどうかは、ローカルバージョンが汚れていることを意味します。

model.isNew();モデルがサーバーに保存されていない場合にのみ機能します。

+0

ダーティビットは、それは(あなたの定義に応じて)変更されているかどうかをチェックすると同じものではありません。例:モデルは最初はisGood:true、isGood:falseに変更し、isGood:trueに戻ることができます。この場合、汚れたビットがオンになりますが、モデルは実際には変更されません。それは大丈夫ですか? – Matt

答えて

16

EDIT:この答えは前バックボーンの1.0バージョンに書き込まれました。現在のバックボーンバージョン(1.2.2)から、hasChangedは「最後の保存以降」の変更を反映しなくなりました。代わりに、「最後のからに変更した」という変更が反映されます。


変更イベントを聞くか、hasChangedを確認してください。

モデルが変更された場合、変更時に保存することができます。変更イベントが発生したときに、保存メソッドを呼び出すこともできます。

変更を保存しない場合は、モデルをダーティにするプロパティを設定し、明示的に保存するときにそのプロパティをクリアします。

のような何か:

change: function(){ 
    this.dirty = true; 
} 

save: function(){ 
    // do your save 
    if(success){ 
     this.dirty = false; 
    } 
} 

isDirty: function(){ 
    return this.dirty 
} 
+1

汚れのないバージョンがありますか? – knub

+0

@knubどういう意味ですか?バックボーンはこれを提供しません。それらは 'change'イベントと' hasChanged'メソッドを提供します。これは、ダーティー・データ・セーブ・オン・ダーティー・データ・システムを実装する方法です。理想的には、 'change'イベントを受け取ったときに' model.save() 'を呼び出すだけです。そうすれば、クライアントを失うと変更内容が失われることはありません。 – tkone

+0

バックボーンコアに隠されている情報が私に提供される可能性があると考えました。つまり、Backboneはその情報を持っているだけで、それは私には提供されません。 汚れた汚れが汚れています。 しかし、確かに他の解決策はありません(まだですか?)。 – knub

4

代替オプション「サイレント」のアップデートにすべての更新を設定し、同期したいときに変更を収集することです:

// Updates 
myModel.set({foo: 'bar'}, {silent: true}); // Does not fire a 'changed' event 
myModel.set({foobar: 'barfoo'}, {silent: true}); 

// Sync 
if (myModel.hasChanged()) { 
    console.log(myModel.changedAttributes()); // {'foo':'bar', 'foobar':'barfoo'} 
    _.each(myModel.changedAttributes(), function(value, key) { 
    console.log(key+' used to be '+myModel.previous(key)+', but now is '+value); 
    } 
    myModel.save(); 
} 
+0

はバックボーン1.1.2で動作していないようです – user116293

5

私が働いていますCouchDBとCouchには、保存成功ごとに変更される_rev属性があります。私は機能を初期化したモデルで、次のコードを配置することによって、「以来、最後にサーバ保存」の問題を解決:

 initialize : function() { 
     this.on('change',function(){ 
      if(this.hasChanged('_rev')) { 
       this.isSaved = true; 
      }else{ 
       this.isSaved = false; 
      } 
     },this); 
     } 
0

あなたは{サイレント渡さない限り、(イベントを使用して)変更をリッスン示唆すべての答えが正しいです: true}オプションを使用します。その場合、変更された属性を保存し、saveメソッドを呼び出した後にそのリストをリセットするために、デフォルトのsetメソッドを上書きする必要があります。

MidnightLightningの回答が正しくありません。

changedAttributesmodel.changedAttributes([attributes])

を以降に変更された唯一のモデルの属性のハッシュを取得します。それは、バックボーンのドキュメントであります - あなたが設定メソッドを呼び出した場合は二回、その後changedAttributesは、最後のセットの呼び出し以降変更している属性のみが返されます。最後に設定されます。存在しない場合はfalseです。私の場合は

私はこのコードの問題解決:私はモデル内silentChagesプロパティを使用するすべての変更の属性を取得したい場合は

(function(_, Backbone) { 
    'use strict'; 

    var _set = Backbone.Model.prototype.set, 
    _save = Backbone.Model.prototype.save; 

    _.extend(Backbone.Model.prototype, { 
    set: function(key, val, options) { 
     var options = this._getOptions(key, val, options), 
     toReturn = _set.call(this, key, val, options); 
     if(!_.isUndefined(options) && options.silent && !!this.changedAttributes()) { 
     this.silentChanges = _.extend([], this.silentChanges); 
     [].push.apply(this.silentChanges, _.keys(this.changedAttributes())); 
     } 
     return toReturn; 
    }, 
    save: function(key, val, options) { 
     var options = this._getOptions(key, val, options), 
     toReturn = _save.call(this, key, val, options); 
     if(!_.isUndefined(options) && options.triggerSilents) { 
     this.triggerSilentChanges(); 
     } 
     return toReturn; 
    }, 
    unset: function(key, options) { 
     if(!_.isUndefined(options) && options.silent) { 
     this.silentChanges = _.extend([], this.silentChanges, _.keys(this.changedAttributes())); 
     } 
    }, 
    triggerSilentChanges: function() { 
     if(!_.isEmpty(this.silentChanges)) { 
     var that = this; 
     _.each(this.silentChanges, function(key) { 
      that.trigger('change:' + key); 
      that.silentChanges = _.without(that.silentChanges, key); 
     }); 
     Backbone.Model.prototype.trigger.call(this, 'change'); 
     } 
    }, 
    _getOptions: function(key, val, options) { 
     if(key == null || _.isObject(key)) { 
     return val; 
     } 
     return options; 
    } 
    }); 
})(_, Backbone); 

を。 保存時にすべてのセット/アンセット属性のイベントをトリガーしたい場合は、 'triggerSilents:true'オプションを追加します。 triggerSilentChangesメソッドを呼び出すことによって、すべての変更イベントを手動でトリガーすることもできます。

0

参考のため、私は、デフォルトのBackbone.syncメソッドを置き換える小さなコードスニペットを作成しました。

置き換えられたBackbone.syncは、最後のsave()以降にどの属性が変更されたかを示し、モデルとコレクションの両方で機能します。

https://github.com/ChiefORZ/backbone.dirty-sync

関連する問題