【发布时间】:2014-12-01 15:32:32
【问题描述】:
更新服务器上的所有模型后,我在刷新集合或更准确的集合视图时遇到问题。这是我的场景:
我从服务器获取了一组问题。每个问题都有一个位置属性,因此我可以操纵列表中的顺序并以适当的顺序将其保存回服务器。
我有一个用于每个列表项的视图和一个具有更全局范围的视图,它生成每个列表项并更新集合。基本上,我使用的是 O'Reilly 书籍“Javascript Web 应用程序”中的一个示例,该示例与此处发现的著名 Todo 注释教程非常相似:http://documentcloud.github.com/backbone/docs/todos.html 所以除了一些定制模型外,结构几乎相同。一切正常。
-
但是,我在更新集合时遇到了问题,我重新排序了 我的全局视图中有一个方法,每当我在列表中拖动列表项时都会触发该方法。顺便说一句,它运行良好并更新了服务器上项目的顺序,但我也希望能够更新列表中每个项目的数字。
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() 调用?
编辑:
我终于设法让它与重置一起工作,清除视图并重新获取新集合。也许这不是最好的方法,因为有一个额外的调用服务器与 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();
},
【问题讨论】:
-
你能显示你的视图代码吗?特别是与呈现集合或使用集合事件等相关的任何内容。
-
@kpeel 我更新了我的帖子以包含整个主视图..现在应该更清楚了..
标签: javascript backbone.js jquery-ui-sortable