私は Backbone を初めて使用し、Backbone を接続した JSON API を使用して Rails アプリを開発しました。
サイトを直接使用してリンクをたどると、すべてがうまく機能します.
/#/1 へのリンクをクリックすると、投稿が 1 の ID をたどる番組ページに移動します。
ただし、ページを更新すると、その情報が表示されなくなり、エラーがスローされます。
"Uncaught TypeError: 未定義のメソッド 'toJSON' を呼び出せません"
コンソールにアクセスしてビューBackboneBlog.router.show(1)
にアクセスすると、正しく機能します。問題が発生するのは私が行ったときだけhttp://localhost:3000/#/1
です。ただし、インデックス ページのリンクをクリックすると、直接リンクします。 http://localhost:3000/#/1
さらに陽気なことBackboneBlog.router.posts
は正しいです。ただし、私のコードでそれを正確に入力すると、 add BackboneBlog.router.posts.get(1)
、 undefined が返されます。ただし、同じ URL を使用してコンソールでその正確なコードを実行すると、機能します。
これが私のコードです:
posts_router.js.coffee--
class BackboneBlog.Routers.PostsRouter extends Backbone.Router
initialize: ->
@posts = new BackboneBlog.Collections.PostsCollection()
@posts.fetch()
routes:
"": "index"
"new" : "newPost"
"index" : "index"
":id/edit" : "edit"
":id" : "show"
".*" : "index"
newPost: ->
@view = new BackboneBlog.Views.Posts.NewView(collection: @posts)
$("#posts").html(@view.render().el)
index: ->
@view = new BackboneBlog.Views.Posts.IndexView(posts: @posts)
$("#posts").html("")
$("#posts").html(@view.render().el)
show: (id) ->
console.log(@posts) #puts PostsCollection, with posts in it
console.log(id) #puts 1
@post = @posts.get(id)
console.log(@post) #puts undefined
@view = new BackboneBlog.Views.Posts.ShowView(model: @post)
$("#posts").html(@view.render().el)
edit: (id) ->
post = @posts.get(id)
@view = new BackboneBlog.Views.Posts.EditView(model: post)
$("#posts").html(@view.render().el)
show_view.js.coffee --
BackboneBlog.Views.Posts ||= {}
class BackboneBlog.Views.Posts.ShowView extends Backbone.View
template: JST["backbone/templates/posts/show"]
render: ->
$(@el).html(@template(@model.toJSON() ))
return this
index_view.coffee --
BackboneBlog.Views.Posts ||= {}
class BackboneBlog.Views.Posts.IndexView extends Backbone.View
template: JST["backbone/templates/posts/index"]
initialize: () ->
@options.posts.bind('reset', @addAll)
addAll: () =>
$("tbody").html("")
@options.posts.each(@addOne)
addOne: (post) =>
view = new BackboneBlog.Views.Posts.PostView({model : post})
@$("table").append(view.render().el)
render: =>
$(@el).html(@template(posts: @options.posts.toJSON() ))
@addAll()
return this
backbone_blog.js.coffee --
window.BackboneBlog =
Models: {}
Collections: {}
Routers: {}
Views: {}
init: ->
@router = new BackboneBlog.Routers.PostsRouter()
Backbone.history.start()
皆さんありがとう!<3
編集:
tl;dr: 直接アクセスするhttp://localhost:3000/#/1
とエラーが発生しますが、そこにリンクすると問題なく動作します。コンソールに入力すると、正常に動作します。機能しないのは、URL に直接移動した場合のみです。それでも、 show メソッドでは、投稿を直接取得するまですべてが機能します