Backbone.js未在集合中迭代
有点奇怪 我有收藏:Backbone.js未在集合中迭代,backbone.js,coffeescript,Backbone.js,Coffeescript,有点奇怪 我有收藏: class Store.Collections.Product extends Backbone.Collection url: '/api/products' model: Store.Models.Product 有人认为: class Store.Views.Origin extends Backbone.View initialize: -> @collection = new Store.Collections.Product
class Store.Collections.Product extends Backbone.Collection
url: '/api/products'
model: Store.Models.Product
有人认为:
class Store.Views.Origin extends Backbone.View
initialize: ->
@collection = new Store.Collections.Product()
@collection.fetch()
@model.bind('change:formatted', @render, this);
@render()
events:
'change [name=origin]': 'setOrigin'
el: =>
@options.parent.$('.origin-input')[0]
template: JST["backbone/templates/shapes/product"]
render: ->
$this = $(this.el)
$this.html(@template(model: @model.toJSON(), errors: @model.errors))
console.log(@collection)
@collection.each(@appdenDropdown)
@delegateEvents()
this
appdenDropdown: (product) ->
console.log("append trigger")
#view = new Store.Views.Products(model: product)
#$('#history').append(view.render().el)
使用模板:
<div id="history"></div>
显示数据!然而
@collection.each(@appdenDropdown)
不做任何事,不出错,或通过任何事情。这根本没用。我正试图从收集中提取数据!但它不会…因为这个系列中还没有任何东西 初始值设定项中的
@collection.fetch()
是一个异步方法。在遍历集合项之前,必须等待获取完成
fetch()
函数接受可选的成功回调,该回调在提取完成时触发
因此,您可以更新初始值设定项代码,以便在调用render
之前等待获取集合。这是代码
initialize: ->
@collection = new Store.Collections.Product()
@collection.fetch
success: =>
@render()
因为收藏品中还没有什么 初始值设定项中的
@collection.fetch()
是一个异步方法。在遍历集合项之前,必须等待获取完成
fetch()
函数接受可选的成功回调,该回调在提取完成时触发
因此,您可以更新初始值设定项代码,以便在调用render
之前等待获取集合。这是代码
initialize: ->
@collection = new Store.Collections.Product()
@collection.fetch
success: =>
@render()
其他人提到的问题是
fetch
是异步的,但解决方案更简单:jQuery的deferred
对象:
initialize: ->
@collection = new Store.Collections.Product()
@collection.deferred = @collection.fetch()
@model.bind('change:formatted', @render, this);
@collection.deferred.done ->
@render()
这里发生的事情是,当您调用@collection.deferred.done
时,您告诉jQuery在对其执行render
之前等待集合加载,这正是您想要的。我认为这应该行得通
关于延迟的的几篇很好的参考文献:
其他人提到的问题是fetch
是异步的,但解决方案更简单:jQuery的延迟对象:
initialize: ->
@collection = new Store.Collections.Product()
@collection.deferred = @collection.fetch()
@model.bind('change:formatted', @render, this);
@collection.deferred.done ->
@render()
这里发生的事情是,当您调用@collection.deferred.done
时,您告诉jQuery在对其执行render
之前等待集合加载,这正是您想要的。我认为这应该行得通
关于延迟的的几篇很好的参考文献:
检查或顺便问一下:当你有这个时,$this=…
为什么要这样做。$el
。我建议阅读backbone.js文档,并明确nikoshr的答案:collection.fetch是异步的
,您可能在fetch返回之前用initialize方法呈现视图,因此集合是空的。console.log是wtfsynchronous
,因此它将集合记录为已填充。您需要做的是将render方法绑定到集合的reset事件,以确保视图在集合被填充后也得到渲染。请看,集合不是空的,因为它在console.log中显示了它的数据,我只是用它来测试console.log,它显示了一个填充的集合,我链接的第二个答案对此进行了解释。小结:console.log玩把戏,在登录之前克隆集合,看看你得到了什么检查或顺便说一句:当你有这个时为什么要$this=…
。$el
。我建议阅读backbone.js文档,并明确nikoshr的答案:collection.fetch是异步的
,您可能在fetch返回之前用initialize方法呈现视图,因此集合是空的。console.log是wtfsynchronous
,因此它将集合记录为已填充。您需要做的是将render方法绑定到集合的reset事件,以确保视图在集合被填充后也得到渲染。请看,集合不是空的,因为它在console.log中显示了它的数据,我只是用它来测试console.log,它显示了一个填充的集合,我链接的第二个答案对此进行了解释。小结:console.log玩把戏,在登录之前克隆集合,看看你能得到什么。你能停止一切直到集合被填满吗?@CharlieDavies这样的做法会让MVC无法像那样等待。另一种方法是让视图侦听集合重置以执行渲染。this.collection.on('reset',this.render,this));因此,当您执行抓取(触发“重置”事件)时,将自动调用render。您能停止所有操作直到集合填满吗?@CharlieDavies这样做会让MVC无法像那样等待。另一种方法是让视图侦听集合重置以执行渲染。this.collection.on('reset',this.render,this));因此,当您执行抓取(触发“重置”事件)时,将自动调用render。更正:我认为@Paul使用成功
回调的回答实际上也做了同样的事情。感谢您的帮助,这对我来说现在更有意义了!非常感谢!更正:我认为@Paul使用success
回调的回答实际上也做了同样的事情。谢谢你的帮助,这对我来说现在更有意义了!非常感谢!