marionette serializeData没有收藏中的模特

时间:2013-07-30 09:38:50

标签: coffeescript handlebars.js marionette

我为单页应用设置了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模型,但不可用。我该如何解决这个问题?

如果您需要其他数据,请发表评论并发布。

感谢。

1 个答案:

答案 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而不是主干同步机制 - 但是看一下这篇文章,这对你的情况很有用:

http://lostechies.com/derickbailey/2012/02/03/get-a-model-from-a-backbone-collection-without-knowing-if-the-collection-is-loaded/