2012-04-14 51 views
1

這裏是場景 - 一個頁面呈現一些小部件,它們向用戶顯示一些聚合數據。這些數據從API中檢索,並定期重新計算。顯示這些都很好(感謝在stackoverflow的人),但我只是無法重新呈現視圖時,服務器上的數據更改。值得注意的是,如果只有一個更新數據,我寧願更高效的方法來不重新渲染所有頁面的小部件(可能是10+)。以一定間隔獲取集合很容易,但關於渲染chaned模型的最佳實踐是什麼?我已經看過有關覆蓋同步功能的各種帖子,但並不確定要去哪裏。Backbone.js從服務器就地更新模型

有沒有什麼辦法可以重新渲染視圖(而不是重新添加到頁面)。

非常感謝

回答

2

我想你需要的是更新現有車型進入收藏,而不刷新整個集合。檢查my answer here

+0

這似乎是一個不錯的實用功能發揮,但究竟應該如何叫什麼名字?調用fetch()後,它會覆蓋集合,然後我可以調用此函數來更新(而不是重置)。 – crawf 2012-04-15 00:44:55

+1

您必須使用額外的_temporal_'Model'來獲取原始JSON數據,並從這裏使用'App.Utils.refreshCollection()'方法_refresh_真正的'Collections',而不用調用'fetch()'。 – fguillen 2012-04-15 10:29:48

+0

啊哈,我明白你的意思了!感謝您的提示 - 我實際上使用了上述鏈接的breischl答案,但我寧願不改變源代碼。我會給你的解決方案,並看看它是如何去。謝謝! – crawf 2012-04-15 11:03:23

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

是的,我之前玩過這個遊戲,但'change'事件不會觸發,因爲fetch()將完全替換集合(因此集合沒有改變)。 – crawf 2012-04-15 00:48:32

相關問題