所以我是骨干的新手,我开发了一个带有JSON API的Rails应用程序,我将骨架挂在。
。直接使用该网站并按照链接进行链接时,每件事都很好。
当我单击一个直接到/#/1的链接中,它将我引向显示页面,帖子遵循一个ID。
但是,如果我刷新页面,它将不再显示该信息,并引发错误:
"未定义的typeError:无法调用'tojson'tojson'
当我进入控制台并访问视图BackboneBlog.router.show(1)
时,它确实可以正常工作。只有当我去http://localhost:3000/#/1
时,我才会遇到问题。但是,当我单击索引页面中的链接时,该链接直接链接到http://localhost:3000/#/1
更有趣的是BackboneBlog.router.posts
是正确的。但是,如果在我的代码中键入该键,但是添加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
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时,它才能起作用。即便如此,在节目方法中,每件事都有效,直到我直接获得帖子
您的问题是您正在传递尚未获取的模型。因此,该模型是未定义的,因此您无法在未定义的模型上调用.Tojson。异步函数非常具有误导性,尤其是在尝试安装时。因此,以此示例为例,您会委托一个未定义的模型。现在,当获取该模型时,您已记录的未定义模型将被替换为已获取的数据。因此,它看起来好像是按顺序发生的,但是您实际上是在将未定义的模型传递到您的视图中。
这就是为什么当您导航您的节目视图时,一切正常。这是因为您的收藏已经被获取。当您从节目视图中刷新时,该集合仍然需要获取,但是您的节目视图并没有等待收集的收藏。
我希望这是有道理的。但是要向您展示我的意思,只会在路由器上打电话给您的节目方法,以获取收藏的成功回调。
让我知道我是否可以进一步帮助您。