如何处理Marionette中的嵌套收集事件?

时间:2014-02-28 01:06:02

标签: backbone.js marionette backbone-collections

我有一个API资源,它为我提供了users的列表,每个items都有多个- users - user - items - item - item - item - user - items - item - item - item 。层次结构如下:

users

我想在一个页面上显示user列表,每个items条目也会在页面上显示每个items

如果点击其中任何一个chosen,则应设置可通过整个users集合访问的item属性。

我很难让items点击信息冒泡回来。我当前的实现是创建一个单独的user集合以呈现视图,但后来我失去了与其原始item模型的连接,因此我无法在class List.Item extends Marionette.ItemView template: "path/to/template" events: "click" : "choose" choose: (e) -> # what to do? class List.User extends Marionette.CompositeView collection: @collection template: "path/to/template" itemView: List.Item itemViewContainer: "span" initialize: -> @collection = new App.Entities.Items(@model.get("items"), parent: @) events: "click a" : "toggleChoose" @include "Chooseable" class List.Users extends Marionette.CollectionView itemView: List.User 时通知它被选中。

我的观点结构如下:

List.Item

是否有更好的方法来构建这些集合或视图,或者是否有办法将信息从List.User视图传递到父users视图,然后传递到{{1}}集合?

修改

我尝试过骨干关系,但它似乎没有做我需要的东西。如果我错了,请纠正我。

2 个答案:

答案 0 :(得分:0)

您的List.Item应该包含它的当前模型,其中包含触发选择时的所有属性。通过这种方式,您可以使用List.Item的模型值触发其他事件:

choose(e) : ->
  trigger("mylistitem:choose", model)

然后在其他地方听取这个事件:

itemView.on("itemview:mylistitem:choose", ( childView, model ) -> {
 alert(model.get('..whatever..')
}

答案 1 :(得分:0)

实际上可以实例化items集合以直接在Backbone中引用父user,反之亦然:

class Entities.User extends Backbone.Model
  ...
  initialize: ->
    @items = new Entities.Items @get("items"),
      user: @

class Entities.Items extends Backbone.Collection
  ...
  initialize: (models, options) ->
    @user = options?.user

现在List.User CompositeView可以将此信息传递给List.Item ItemView:

class List.User extends Marionette.CompositeView
  collection: @collection
  ...
  initialize: ->
    @collection = @model.items

有了这个,就可以直接从ItemView访问user

class List.Item extends Marionette.ItemView
  ...
  events:
    "click" : "choose"

  choose: (e) ->
    e.preventDefault()
    user = @model.collection.user
    console.log "user: ", user

从那里可以对user及其集合采取任何必要的行动。