2011-02-21 17 views
3

私はBackbone.jsにViewを取得しようとしていますが、データが変更されている場合にのみ 'change'イベントが発生したときに保存します。モデルが変更されたときに明確にmodel.hasChanged()falseである理由私が知りたいのですがBackbone.jsがModel.hasChangedイベントを登録していません

function changed_event() { 
    log.debug("Before: " + this.model.get('name')) // not 'contrived!' 
    this.model.set({'name': 'contrived!'}); 
    log.debug("After: " + this.model.get('name')) // 'contrived!' 

    if (this.model.hasChanged()) { 
     alert("This is never called."); 
    } 
} 

かいつまんで、私はこれを呼び出して表示に設定された「変更」イベントをしました。

私は他にどんな情報が必要なのか分かりませんが、もっと役立つ情報があればコメントしてください。私は詳しく説明します。

ありがとうございます。

答えて

10

model.setを呼び出すと、変更イベントが発生します。 .hasChanged()は、最後の変更イベント以降にモデルが変更された場合はtrueを返します。その変更イベント以降は何も変更されていないので、falseを返します。希望の動作を得るには、silentオプションを使用して.setに電話してください:this.model.set({'name': 'contrived!'}, {silent: true})

+3

これは間違いありません。 Brianと私は、最後の同期以来変更されたプロパティのリストを望んでいたようです。 – funwhilelost

+0

また、どの属性が変更されたかをトラッキングする方法も必要です。 '_previousAttributes'がこれを追跡すると思うでしょうが、setで更新されます。 – brad

+1

変更された属性のリストを保存してそのリストを保持する場合は、this.previousChangedAttrs = this.changedAttributes()のような変更イベントのハンドラを作成します。その後、いつでも好きなときにpreviousChangedAttrsをチェックすることができます。 changeイベントは、silentオプションなしでset()を呼び出すたびに発生するので、setへの複数の呼び出しによってpreviousChangedAttrsがリセットされることに注意してください。必要に応じて、配列を作成して変更の履歴を追跡することができます。私自身のクライアント側の取り消しシステムをロールバックすることを考えさせる... – mtjhax

関連する問題