リンクを介してアクセスされる投稿の表示ページを設定しようとしています:
<a class="post-link button" href="#">details</a>
投稿アイテムがレンダリングされると、次のような href が与えられます。
this.$('a').attr('href', this.postUrl());
...
postUrl: function() {
return "#posts/" + this.model.get('id');
}
フィールドがレンダリングされると、リンクは次のように表示されます。
http://[path_to_app]/#posts/[whatever_id]
リンクをクリックすると、次のルーターにヒットするはずです。
routes: {
'' : 'index',
'new' : 'newPost',
"posts/:id" : 'show'
}
しかし、私はこのエラーを受け取り、show 関数にはまったく入りません:
Uncaught Error: Syntax error, unrecognized expression: /1 jquery.js:4268
Sizzle.errorjquery.js:4268
Sizzle.filterjquery.js:4254
Sizzlejquery.js:4044
Sizzlejquery.js:5176
jQuery.fn.extend.findjquery.js:5432
jQuery.fn.jQuery.initjquery.js:188
jQueryjquery.js:28
hashchangetabs.js:9
jQuery.event.dispatchjquery.js:3333
jQuery.event.add.elemData.handle.eventHandle
リンクを「#post/」+ id に変更し、ルートを「post/:id」に変更すると、このエラーは発生しません。
私はバックボーンを学んでいる途中で、ここで実際に手を使うことができます. また、注意してください: 私のルートは posts#index アクションにルートします。
編集(より関連性の高いコード):
# Model
[APP].Models.Post = Backbone.Model.extend({
urlRoot: '/posts'
});
#Router
[APP].Routers.Posts = Support.SwappingRouter.extend({
initialize: function(options) {
this.el = $('#posts');
this.collection = options.collection;
},
routes: {
'' : 'index',
'new' : 'newPost',
"posts/:id" : 'show'
},
index: function() {
var view = new [APP].Views.PostsIndex({ collection: this.collection });
this.swap(view);
},
newPost: function() {
var view = new [APP].Views.PostsNew({ collection: this.collection });
this.swap(view);
},
show: function(postId) {
var post = this.collection.get(postId);
var postsRouter = this;
post.fetch({
success: function() {
var view = new [APP].Views.PostShow({ model: post });
postsRouter.swap(view);
}
});
}
});
#Post Item View
[APP].Views.PostItem = Backbone.View.extend({
tagName: 'tr',
initialize: function() {
_.bindAll(this, 'render');
},
render: function () {
this.$el.attr('id', 'post_' + this.model.id);
this.$el.html(JST['posts/item']({ post: this.model }));
this.renderFormContents();
return this;
},
renderFormContents: function() {
...
this.$('a').attr('href', this.postUrl());
},
postUrl: function() {
return "#posts/" + this.model.get('id');
}
});