BackBone&轨道

时间:2012-04-23 18:40:38

标签: ruby-on-rails backbone.js coffeescript

我在向Backbone / Rails项目中添加第二个Collection时遇到问题

这是我的收集公司的类文件

class Raffler.Collections.Companies extends Backbone.Collection
  url: '/api/companies'
  model: Raffler.Models.Company

这是Model

的Class文件
class Raffler.Models.Company extends Backbone.Model

继承人的路由器

class Raffler.Routers.Companies extends Backbone.Router
  routes:
    'companies': 'index'
    'companies/:id' : 'show'

  initialize: ->
    @companies = new Raffler.Collections.Companies()
    @companies.fetch()
    alert @companies

  index: ->
    view = new Raffler.Views.CompaniesIndex(collection: @companies)
    $('#container').html(view.render().el)

这是视图

class Raffler.Views.CompaniesIndex extends Backbone.View

  template: JST['companies/index']

  initialize: ->
    @companies.on('reset', @render, this)

  render: ->
    $(@el).html(@template(companies: @companies))
    this

当我到达@companies.on时,它会失败 - 错误是在未定义时无法调用方法'。

我不明白这个错误 - 我已将@companies设置为路由器中的Collection并将其传递到路由器类中创建的视图中。

我在应用程序中的另一个集合上实现了完全相同的代码,所以我想知道是因为我正在尝试添加第二个集合吗?

当我执行以下操作时,它在浏览器的javascript控制台中完美运行

companies = new Raffler.Collection.Companies()
companies.fetch()
companies.length

我可以看到它正在调用服务器并返回正确数量的记录 - 那么为什么代码不能在应用程序中运行?有什么想法吗?

1 个答案:

答案 0 :(得分:3)

在你的路由器中,你这样说:

view = new Raffler.Views.CompaniesIndex(collection: @companies)

这会将新的CompaniesIndex的@collection property设置为@companies

  

有几个特殊选项,如果通过,将直接附加到视图:[...] collection [...]。

因此,在您看来,您应该参考@collection,而不是@companies

class Raffler.Views.CompaniesIndex extends Backbone.View
  #...
  initialize: ->
    @collection.on('reset', @render, @)

@companies仅在路由器内定义,视图只知道@collection,除非您在视图中明确指定了@companies