我有一个带有 Backbone.js 的 Rails 3.2.3 应用程序,我在我的 Backbone.history 上使用 pushState。
问题
当我点击一个显示“/foo”的链接以显示 ID:1 的约会时,Backbone 路由器首先到达那个位置,我可以在 Rails 路由器接管并抱怨没有 /foo 的路由之前快速看到它.
我的 Backbone.js 代码
这是我的骨干路由器。
window.AppointmentApp = new (Backbone.Router.extend({
routes: {
"": "index",
"foo": "foo",
"appointments": "index",
"appointments/:id": "show"
},
foo: function(){
$("#app").append("foo<br />");
},
initialize: function() {
this.appointments = new Appointments();
this.appointmentListView = new AppointmentListView({ collection: this.appointments });
this.appointmentListView.render();
},
start: function() {
Backbone.history.start({pushState: true});
},
index: function() {
$("#app").html(this.appointmentListView.el);
this.appointments.fetch();
},
show: function(id) {
console.log("Enter show");
}
}));
它应该保持在同一页面上并在#app div 的末尾附加一个“foo”,但它永远不会这样做。
骨干索引查看器
window.AppointmentListView = Backbone.View.extend({
template: JST["appointments/index"],
events: {
"click .foo": function(){Backbone.history.navigate("foo");},
},
comparator: function(appointment){
return appointment.get('topic');
},
initialize: function(){
this.collection.on('reset', this.addAll, this);
},
render: function(){
this.$el.html(this.template);
this.addAll();
return this;
},
addAll: function() {
this.collection.forEach(this.addOne, this);
},
addOne: function(appointment){
var appointmentView = new AppointmentView({model: appointment});
this.$el.append(appointmentView.render().el);
}
});
应用程序/资产/模板/约会/Index.jst.ejs
<h1>Appointments</h1>
<a href="/foo" class="foo">Say Foo</a>
<a href=appointments/add>Add</a>
<div id="app"></div>
我使用的是 pushState,因为它允许我保留历史记录和后退按钮功能。
Backbone.history.navigate 不调用我的 Backbone 路由,而是调用 Rails 路由。我该如何解决这个问题?
我应该尝试将 Backbone 设置为接受诸如“约会/1”之类的路由并进行控制,还是必须像上面那样使用带有 Backbone.history.navigate 调用的点击事件?