我在更新服務器上的所有模型後刷新集合或更精確地收集視圖時出現問題。這裏是我的場景:Backbone Collection刷新所有項目
我有從服務器提取的問題的集合。每個問題都有一個位置屬性,所以我可以操縱列表中的順序並將其以適當的順序保存回服務器。
我有一個視圖,每個單個列表項目和一個更全局範圍的視圖,生成每個列表項目和更新集合。基本上我使用的是O'Reilly書中的「Javascript Web Applications」,它與很多着名的Todo註釋教程類似:http://documentcloud.github.com/backbone/docs/todos.html 因此,除了一些自定義模型外,結構幾乎相同。 Everythings正常工作。
但是,我在更新集合時遇到問題,我在 中重新排序項目我在我的全局視圖中激活了一個方法,該方法在列表中拖動列表項。順便說一句,它運作良好,並更新服務器上的項目的順序,但我也希望能夠更新列表中每個項目的數字。
window.QuestionView = Backbone.View.extend({ el: $("#content"), events : { 'sortupdate ol#questions': 'sortStuff' }, initialize: function(collection) { this.collection = new QuestionsList; _.bindAll(this, 'addOne', 'addAll', 'render', 'addNewItem', 'addItem'); this.collection.bind('add', this.addNewItem); this.collection.bind('all', this.render); this.collection.bind('reset', this.addAll); this.collection.fetch({ data: { quiz_id: $qid }, processData:true }); }, render: function() {}, sortStuff: function() { $this = this; $.ajax({ url: "/hq/reorder/", type: "POST", data: $("#questions").sortable("serialize")+"&id="+$qid, dataType: 'json', success: function(data) { } }); }, addItem: function() { this.collection.add({title: 'New title goes here'}); return false; }, addNewItem: function(question) { var view = new ItemView({model: question, parent: this}); var element = view.render().el; this.$("#questions").prepend(element); $that = this; $(view.render().el).addClass('new'); }, addOne: function(question) { var view = new ItemView({model: question, parent: this}); this.$("#questions").prepend(view.render().el); }, addAll: function() { this.collection.each(this.addOne); return false; }
});
也是我的 成功:函數(數據) 將新訂單作爲列表(或JSON對象)從服務器返回。也許我可以重新使用這個命令來爲每個模型設置一個新的值,而不必在每次訂單改變時在服務器上進行不必要的fetch()調用?
編輯:
我終於設法得到它與復位工作,清除視圖和重新獲取一個新的集合。也許是不這樣做,因爲有到服務器的額外調用了取()..
sortStuff: function() {
$this = this;
$.ajax({
url: "/hq/reorder/",
type: "POST",
data: $("#questions").sortable("serialize")+"&id="+$qid,
dataType: 'json',
success: function(data) {
$this.rerender();
}
});
},
rerender: function() {
this.collection.fetch({
data: { quiz_id: $qid },
processData:true
});
$("#questions").html("");
this.collection.reset();
this.addAll();
},
你能顯示你的視圖代碼嗎?具體來說,任何涉及到渲染集合,或與收集事件等工作。 – 2012-02-16 17:31:54
@kpeel我更新了我的帖子,包括整個主視圖..現在應該更清楚.. – kernelpanic 2012-02-16 21:30:07