0

我在向我的 Backbone/Rails 项目添加第二个集合时遇到问题

这是我的收藏公司的课程文件

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

这是模型的类文件

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- 错误是无法在未定义上调用方法'on'。

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

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

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

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

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

4

1 回答 1

3

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

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

这会将新 CompaniesIndex的@collection属性@companies设置为:

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

所以在你看来,你应该参考@collection,而不是@companies

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

@companies@collection仅在路由器内部定义,除非您在视图内部显式分配某些内容,否则视图只会知道@companies

于 2012-04-23T19:19:36.110 回答