直接通过URL访问时,骨干轨未加载帖子



所以我是骨干的新手,我开发了一个带有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。异步函数非常具有误导性,尤其是在尝试安装时。因此,以此示例为例,您会委托一个未定义的模型。现在,当获取该模型时,您已记录的未定义模型将被替换为已获取的数据。因此,它看起来好像是按顺序发生的,但是您实际上是在将未定义的模型传递到您的视图中。

这就是为什么当您导航您的节目视图时,一切正常。这是因为您的收藏已经被获取。当您从节目视图中刷新时,该集合仍然需要获取,但是您的节目视图并没有等待收集的收藏。

我希望这是有道理的。但是要向您展示我的意思,只会在路由器上打电话给您的节目方法,以获取收藏的成功回调。

让我知道我是否可以进一步帮助您。

最新更新