我有一个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}}集合?
修改
我尝试过骨干关系,但它似乎没有做我需要的东西。如果我错了,请纠正我。
答案 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
及其集合采取任何必要的行动。