我在向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
我可以看到它正在调用服务器并返回正确数量的记录 - 那么为什么代码不能在应用程序中运行?有什么想法吗?
答案 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
。