Ruby on rails 绑定到集合的主干重置事件在集合加载数据时未触发
我是主干网新手,从Todos示例开始工作。在此之后,我创建了一个新版本的示例,用于联系人而不是TODO,它使用RubyonRails web应用程序及其关联的RESTAPI而不是localstorage来实现持久性。在进行修改之后,我能够成功地让主干应用程序更新Rails应用程序,但我无法获得主干视图来呈现主干应用程序从Rails REST API接收的数据。我已在调试器中逐步查看了代码,可以看到:Ruby on rails 绑定到集合的主干重置事件在集合加载数据时未触发,ruby-on-rails,backbone.js,backbone.js-collections,Ruby On Rails,Backbone.js,Backbone.js Collections,我是主干网新手,从Todos示例开始工作。在此之后,我创建了一个新版本的示例,用于联系人而不是TODO,它使用RubyonRails web应用程序及其关联的RESTAPI而不是localstorage来实现持久性。在进行修改之后,我能够成功地让主干应用程序更新Rails应用程序,但我无法获得主干视图来呈现主干应用程序从Rails REST API接收的数据。我已在调试器中逐步查看了代码,可以看到: 调用函数来填充视图的事件将绑定到模型集合 当我获取模型数据时,集合将使用来自服务器的数据进行更新
var ContactsList = Backbone.Collection.extend({
model: Contact,
url: 'http://localhost:3000/contacts.json',
});
var Contacts = new ContactsList;
AppView:
var AppView = Backbone.View.extend({
el: $("#contactapp"),
events: {
"keypress #new-contact": "createOnEnter"
},
initialize: function() {
this.input = this.$("#new-contact");
Contacts.bind('add', this.addOne, this);
Contacts.bind('reset', this.addAll, this);
Contacts.bind('all', this.render, this);
Contacts.fetch();
},
addOne: function(contact) {
var view = new ContactView({model: contact});
this.$("#contact-list").append(view.render().el);
},
addAll: function() {
Contacts.each(this.addOne);
},
createOnEnter: function(e) {
if (e.keyCode != 13) return;
if (!this.input.val()) return;
Contacts.create({first_name: this.input.val()});
this.input.val('');
},
});
var App = new AppView;
您可能会看到视图中的
el:$(“#contactsapp”)
配置返回一个空的jQuery选择器
不要将jQuery选择器用作对象文字值。使用主干视图,您只需提供选择器字符串:
el:#contactsapp”
但无论如何,这是个坏主意。您应该让视图呈现它自己的el,并使用其他代码用视图填充“#contactsapp”元素:
$(function(){
view = new AppView();
view.render();
$("#contacts").html(view.el);
});
有关更多信息,请参见上面的链接。经过大量调试后,我发现绑定的
重置
事件没有被触发,因为我使用的是旧版本的backbone.js。在版本中,我使用的是刷新
事件,而不是重置
事件。一旦升级到较新版本的backbone.js,就会触发reset
事件,因此在发生重置时不会调用addAll
?你在那里放了一个断点,让它飞了?没错。我在整个过程中都放置了断点,可以看到事件绑定到集合和获取数据。从那里,它只是继续前进,而不是调用addAll。有什么想法吗?很难说,根据你的代码。我在backbone.js的第746行和第759行设置了一个断点,查看事件是否被触发,以及您的函数是否在该时间点绑定到事件。在我的backbone.js中,第746行是:“this.iframe.document.open().close();”这是您所指的线路吗?请尝试调用Contacts.reset()
,查看事件是否触发。我更正了此问题,但仍然存在相同的问题。在Contacts.fetch()之后,不会触发重置事件。