我为单页应用设置了Marionette和Handlebars。我没有开始这个项目;它最初由其他人开发。
我设法弄清楚其他文件中的东西,但我无法弄清楚这个。
所以,我有模特/ order.coffee
Model = require './model'
Collection = require './collection'
module.exports = class OrderModel extends Model
# This is the *real* orders model
idAttribute: 'uid'
defaults:
title: 'some order'
module.exports = class Orders extends Collection
model: OrderModel
url: base_url+'history/'
initialize: =>
super
@fetch()
parse: (response) =>
return response.objects
parse
因为后端如何返回数据而存在。 response.objects
包含从中创建模型的JSON对象列表,即OrderModel
instances \
接下来有views/SettingsOrderView.coffee
template = require './templates/settings/orders'
module.exports = class SettingsOrdersView extends Backbone.Marionette.ItemView
template: template
events: 'click #back_to_options': 'goToOptions'
serializeData: =>
data = @.collection
setTimeout (-> console.log(data.models)), 5000
$.each data.models, (m_index, m) =>
console.log(m)
return {items: @.collection}
我的问题是我做{{#each items}}
的模板,但它们是OrderModel的实例,因此它们在Handlebars中无用。我需要将它们作为JSON对象,但出于某种原因(实际上collection.fetch()
)不会填充@.collection.models
中的serializeData
。 5秒后(如setTimeout
所示),data.models
列出了我需要的内容,但each
未执行,因为当时data.models
为空列表。
如上所述,我需要JSONize模型,但不可用。我该如何解决这个问题?
如果您需要其他数据,请发表评论并发布。
感谢。
答案 0 :(得分:1)
对于渲染集合,Marionette提供了CollectionView:https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.collectionview.md
有关何时对多个项目使用CollectionView或ItemView的讨论,请参阅此优秀文章: http://lostechies.com/derickbailey/2011/10/11/backbone-js-getting-the-model-for-a-clicked-element/
要序列化模型,可以在模型上调用model.toJSON()。或者您可以使用get()函数或通过在模型和/或集合上编写自己的JSON方法来获取单个属性。在这种情况下,您可以简单地在集合上调用该方法。
但我猜你真正的问题是对fetch()的调用。如果我理解你的话,那么当你尝试使用它们时,模型似乎就会丢失。 Backbone为这种情况提供了成功的回调。当数据准备好时,将调用此回调。
http://backbonejs.org/#Collection-fetch
现在,我从未使用过这个 - 使用websockets和promises而不是主干同步机制 - 但是看一下这篇文章,这对你的情况很有用: