2012-06-25 19 views
5

私はbackbone.jsを使用しており、コレクションのないモデルを持っています。 ビューでは、コールバックを使用してモデルをフェッチしてビューをレンダリングします。モデルが変更されたとき、私は自動的にビューの更新を行うことができますどのようにbackbone.jsの自動更新ビュー

this.user.fetch({success: function(d) { self.randomUserView.render() }}) 

?例えばフェッチを呼び出すたびに上記のコールバックを指定したくありません。私は初期化時に多くのモデルイベントにビューをバインドしようとしましたが、これはうまくいきませんでした。ビューで

答えて

12

、ビューのモデルにイベントハンドラを追加します。

initialize: function() { 
    this.model.on('change',this.render,this); 
} 
+0

このモデルが既にロードされているかどうかに応じて、 '変更'または '追加'のいずれかです。しかし、通常、新しいモデルを読み込むためにfetch()を使うので、 'add'を購読します。 –

+1

あなたはそれを安全にプレイして、すべてのモデルイベントのビューをレンダリングしても構わないと仮定して、 'this.model.bindAll(this.render)'と一緒に行くことができます – jackwanders

1

バックボーンは、イベント駆動型である(技術的に、彼らはコールバックではあるが)、駆動フレームワークをコールバックではありません。そしてあなたのアプローチはバックボーンにとってネイティブではないようです。 fetch()を実行すると、ユーザモデルは自動的に「追加」イベントをトリガします。あなたがやらなければならないことは、初期にこれを追加し、対応するビューである:

initialize: function() { 
    ... your code... 
    this.model.bind('add', this.render); 
} 

ビューの初期化でさえ一度だけこれに加入すると、これまで明示的なコールバックを渡す必要はありませんこの方法です。

+0

バックボーンはフレームワークではなくライブラリです。 – Fdr

0

実際に、コレクションのフェッチ時にビューをリフレッシュするには、RESETをバインドする必要があります。

this.model.bind('reset', this.render, this); 

更新は、現在のコレクションが編集されている場合にのみ発生します。

ps bindAllは危険で怠惰です。

+0

もしあなたがこの回答をdownvoteすれば、理由を説明するのがとても親切だろうか? – sidonaldson