Backbone.js 如何处理木偶中的嵌套集合事件?
我有一个API资源,它为我提供了一个Backbone.js 如何处理木偶中的嵌套集合事件?,backbone.js,marionette,backbone.js-collections,Backbone.js,Marionette,Backbone.js Collections,我有一个API资源,它为我提供了一个用户列表,每个用户都有几个项。层次结构如下所示: - users - user - items - item - item - item - user - items - item - item - item 我想在单个页面上显示用户列表,每个用户条目也会在页面上显示其项目 单击这些项中的任何一项时,应设置一个所选的属性,该属性可通过整个用户集合访问 我很难获取项
用户列表
,每个用户都有几个项
。层次结构如下所示:
- users
- user
- items
- item
- item
- item
- user
- items
- item
- item
- 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
是否有更好的方法来组织这些集合或视图,或者是否有方法将信息从列表.项视图传递到父列表.用户视图,然后传递到用户集合
编辑
我已经试过了,但它似乎没有完全满足我的需要。如果我在这里出错,请更正。您的列表。触发“选择”时,项目应包含其当前模型的所有属性。通过这种方式,您可以使用列表触发其他事件。项的模型值:
choose(e) : ->
trigger("mylistitem:choose", model)
然后在别处收听事件:
itemView.on("itemview:mylistitem:choose", ( childView, model ) -> {
alert(model.get('..whatever..')
}
实际上,可以在主干中实例化项
集合以引用父用户
,反之亦然:
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
class List.Item extends Marionette.ItemView
...
events:
"click" : "choose"
choose: (e) ->
e.preventDefault()
user = @model.collection.user
console.log "user: ", user
有了它,就可以直接从ItemView访问用户
:
class List.User extends Marionette.CompositeView
collection: @collection
...
initialize: ->
@collection = @model.items
class List.Item extends Marionette.ItemView
...
events:
"click" : "choose"
choose: (e) ->
e.preventDefault()
user = @model.collection.user
console.log "user: ", user
从那里可以对用户及其集合采取任何必要的操作。这里的问题是,项目模型没有对其原始用户进行任何引用,那么,如何才能在user或users集合上设置属性呢?看起来您只需要使用某种类型的userId(最简单的解决方案)实例化项目模型。否则,请看一看遍历父集合:在这里,如何使用ID实例化项模型?这对我来说是最自然的解决方案,但我认为这是不可能的。将事件处理程序添加到集合的add函数-因此,每当将子项添加到集合时,都可以设置模型属性。