所以我是 Backbone 的新手,我开发了一个带有 JSON API 的 Rails 应用程序,我已经将 Backbone 连接到了。
当我直接使用该网站并点击链接时,一切都很好。
就像我单击指向 /#/1 的链接一样,它会将我指向显示页面,其中帖子遵循一个 ID。
但是,如果我刷新页面,它将不再显示该信息,并引发错误:
“未捕获的类型错误:无法调用未定义的方法‘toJSON’”
当我转到控制台并访问我的视图BackboneBlog.router.show(1)
时,它确实可以正常工作。只有当我去的时候http://localhost:3000/#/1
,我才会遇到问题。但是,当我单击索引页面中的链接时,该链接直接链接到 http://localhost:3000/#/1
更搞笑的BackboneBlog.router.posts
是正确的。但是,如果在我的代码中我准确地输入了那个,但是 add BackboneBlog.router.posts.get(1)
,它返回未定义。但是,如果我在控制台中使用相同的 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
骨干博客.js.coffee --
window.BackboneBlog =
Models: {}
Collections: {}
Routers: {}
Views: {}
init: ->
@router = new BackboneBlog.Routers.PostsRouter()
Backbone.history.start()
谢谢大家!<3
编辑:
tl;博士:如果我直接访问http://localhost:3000/#/1
我会得到错误,但是,如果我链接到那里,它工作得很好。如果我在控制台中键入它,它工作正常。只有当我直接导航到 URL 时它才不起作用。即便如此,在 show 方法中,一切正常,直到我直接得到帖子