JavaScript Backbone 的问题,请教高手。

sandybeauty · 2013年01月28日 · 最后由 xds2000 回复于 2013年02月12日 · 2683 次阅读

最近想把 backbone 整合到项目中来(https://github.com/AndySze/startupkits)。结果困难重重。

有个奇怪的问题。初始化的变量不能用。 代码

class Startupkit.Routers.Ideas extends Backbone.Router
  routes:
    'ideas/:id':'show'
    '' : 'index'

  initialize: ->
    @ideas = new Startupkit.Collections.Ideas()
    @ideas.fetch()

#index没有问题,可以获取所有的record
  index: ->
    view = new Startupkit.Views.IdeasIndex(collection:@ideas)
    $('#container').html(view.render().el)

#show却不工作了。alert获取长度为0
  show: (id) ->
    idea = @ideas.get(id)
    alert "#{@ideas.length}"
    view = new Startupkit.Views.IdeaShow(model: idea)
    $('#container').html(view.render().el)

@ideas明明已经有内容了。到了 show 动作为什么就没有了?

问题

Router 用了 pushState,导致点击后刷新了页面,所以@ideas还没获取到,show 动作已经开始,从而产生了错误。

解决 暂时把 pushState 关闭,调试完成后再考试开启。这个问题不会 debug,尤其我这新手。

貌似还是有问题,不能完全解决。

pushState 不是根本原因。。model 的 fetch 是异步的,要用 model 的事件来调用 show。。

#1 楼 @yesmeck 确实,发现还是有问题。还是不能工作。

fetch 无论如何都是 async 的,你的 index 行,应该是 IdeasIndex 里面绑定了 event,你 collection reset 了他就自动重新 render 了,你从页面上看就是有数据的。

至于 show,和你的页面不一样。alert 这个函数很呆,你当时那个状态他是什么数据他就显示什么数据。

你的 show 函数也是在同一页面显示。直接用 index 的 event 事件绑定。所有数据加载都是异步,通过 callback 才能正确使用数据。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号