我有两种方法来过滤集合:
方法1:当我将其传递给视图时,使用此方法失败。
byCategory = @projects.byCategory(data)
方法2:此方法效果很好。
byCategory = new App.Collections.Projects(@projects.byCategory(data))
当我按byCategory映射并获得标题时,这两种方法均适用:
byCategory.map (project) ->
console.log project.get('title')
当我将其传递给视图时,第二种方法有效。但是第一种方法失败了:
view = new App.Views.ProjectsCarousel(collection: byCategory)
$('.slides').html(view.render().el);
我的问题是:为什么?为什么第一个传递给视图时会失败,第二个为什么会起作用?第一个产生错误日志:TypeError: _ref is undefined
路由器
class App.Routers.PortfolioRouter extends Backbone.Router
routes:
'': 'index'
index: ->
controls = new App.Views.ProjectsControls({el: '#list', projects: new App.Collections.Projects()});
收藏
class App.Collections.Projects extends Backbone.Collection
url: '/de/projects'
byCategory: (cat) ->
return @where category: cat
观看次数
class App.Views.ProjectsControls extends Backbone.View
events:
'click a': 'selectCategory'
initialize: (options) ->
@projects = options.projects
@projects.fetch()
selectCategory: (event) ->
event.preventDefault()
data = $(event.currentTarget).attr('data-category')
# This method fails when I pass it to the view
# byCategory = @projects.byCategory(data)
# This method works very well, why does it work and the previous no?
byCategory = new App.Collections.Projects(@projects.byCategory(data))
# it works with both methods
byCategory.map (project) ->
console.log project.get('title')
view = new App.Views.ProjectsCarousel(collection: @projects)
$('.slides').html(view.render().el);
class App.Views.ProjectsCarousel extends Backbone.View
template: JST['projects/carousel']
render: ->
@$el.html(@template(projects: @collection))
this
模板
<% for project in @projects.models: %>
<%= project.get('title') %>
<% end %>
我假设会@projects.byCategory(data)
传回的阵列Backbone.model
,而视图则需要的实例Backbone.Collection
。在您看来,您可能正在使用this.collection.models
一个迭代*,并且这.models
是您肯定不会在的普通数组中找到的属性Backbone.model
。
*如果您正在调用
collection.fetch()
或什至甚至.set()
其他Backbone.Collection
方法,则该参数成立
我的直觉(除非您另有说明)是
App.Collections.Projects.byCategory()
返回的数组Backnone.model
,可能通过.map()
或.pluck()
。这个假设将回答您的问题并满足您的.map()
测试。
byCategory = @projects.byCategory(data)
失败?因此,如果我的假设是正确的,则该byCategory
变量不过是的JavaScript数组Backbone.model
。这不是Backbone在使用该Backbone.View.collection
属性时所期望的,例如,当您执行时fetch
,set
或者只是尝试进行迭代collection.models
(并且简单的数组model
不包含.models
prop)。
.map()
总是可以工作?答案并不明显。显然Backbone.collection.map
,由于默认情况下_.map()
已混入,因此工作会很顺利Backbone.Collection
。
.map()
起作用的原因byCategory === @projects.byCategory(data)
取决于两件事。1.byCategory
是一个数组,因此,我假设您使用的是兼容ECMASCRIPT 5的浏览器,它Array.prototype.map()
可以正常工作。而且它接受与混入相同的链接约定,_.map()
并采用与相同的Array
参数_.map()
。因此,实际上,您很容易被愚弄,以为您正在使用Backbone.collection.map()
,而实际上您在使用Array.prototype.map()
。
问题仍然存在,为什么该.get('title')
方法在
console.log project.get('title')
工作?给出以上,很简单。由于您传入了一个Backone.model
to数组Array.prototype.map()
,因此每次迭代中的参数都是Backone.model
,它将很高兴地接受Backone.model.get()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句