Backbone.jsを使用したRails3.2.3アプリがあり、Backbone.historyでpushStateを使用しています。
問題
「/foo」というリンクをクリックしてID:1の予定を表示すると、バックボーンルーターが最初にそのリンクに到達します。これは、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");
}
}));
同じページにとどまり、#appdivの最後に「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);
}
});
app / Assets / templates / appointments / 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は、バックボーンルートを呼び出さず、代わりにRailsルートを呼び出します。これを修正するにはどうすればよいですか?
'appointments / 1'などのルートを受け入れて制御するようにBackboneを設定する必要がありますか、それとも上記のようにBackbone.history.navigate呼び出しでクリックイベントを使用する必要がありますか?