2012-04-14 5 views
1

ここにシナリオがあります。ページは、集計されたデータをユーザーに表示するウィジェットのコレクションをレンダリングします。このデータはAPIから取得され、定期的に再計算されます。これらを表示するのはうまくいきます(stackoverflowの人たちのおかげ)。しかし、サーバ上でデータが変更されたときにビューを再レンダリングするのは難しいです。Backbone.jsサーバーからインプレースでモデルを更新する

特に、1つだけがデータを更新した場合は、すべてのページのウィジェットを再レンダリングしないようにする方が効率的です(10以上も可能)。コレクションをある間隔で取得するのは簡単ですが、モデルをレンダリングする際のベストプラクティスは何ですか?私はsync関数を上書きすることについて様々な投稿を見たことがありますが、実際にどこに行くのかは分かりません。

(ページに再追加するのではなく)インプレースでビューを再レンダリングする方法はありますか?私は何が必要だと思う

本当にありがとうございました

答えて

2

は、コレクション全体をリフレッシュせずにコレクションの中に、既存のモデルの更新です。 my answer hereを確認してください。

+0

一緒にプレイするために、より完全なフィドルが、どのようにそれが呼ばれるべき?一度fetch()を呼び出すと、この関数を(リセットではなく)更新する前にコレクションを上書きします。 – crawf

+1

生のJSONデータを取得するために余分な_temporal_ 'Model'を使用する必要があります。ここから' App.Utils.refreshCollection() 'メソッドを使用して' fetch() 'を呼び出さずに実際の' Collections'を_refresh_します。 – fguillen

+0

ああ、あなたは今何を意味するのか分かります!チップをありがとう - 私は実際に上記のリンクからbreischlの答えを使用していますが、私はソースを変更しないことを望むだろう。私はあなたの解決策を提供し、それがどうなるかを見ていきます。ありがとう! – crawf

1

モデル/コレクションの特定の変更にバインドして、ウィジェットのレンダリングメソッドをトリガーすることができます。たとえば、モデル上:

var Widget1=Backbone.View.extend({ 
    initialize: function() { 
     // all changes on the model will render the widget 
     this.model.on("change", this.render, this); 
    }, 

    render: function() { 
     console.log("Render W1"); 
     this.$el.html("W1 :"+this.model.get("name")+" "+this.model.get("detail")); 
     return this; 
    } 
}); 
var Widget2=Backbone.View.extend({ 
    initialize: function() { 
     // only a change on `detail` will render the widget 
     this.model.on("change:detail", this.render, this); 
    }, 

    render: function() { 
     console.log("Render W2"); 
     this.$el.html("W2 :"+this.model.get("detail")); 
     return this;  
    } 
}); 

素敵なユーティリティ関数のように思えるhttp://jsfiddle.net/GqnKC/

+0

ええと、私はそれを前にして遊んでいましたが、fetch()がコレクションを完全に置き換えるので(コレクションが変更されていないので)、 'change'イベントは発生しません。 – crawf

関連する問題