Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 如何处理木偶中的嵌套集合事件?_Backbone.js_Marionette_Backbone.js Collections - Fatal编程技术网

Backbone.js 如何处理木偶中的嵌套集合事件?

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 我想在单个页面上显示用户列表,每个用户条目也会在页面上显示其项目 单击这些项中的任何一项时,应设置一个所选的属性,该属性可通过整个用户集合访问 我很难获取项

我有一个API资源,它为我提供了一个
用户列表
,每个用户都有几个
。层次结构如下所示:

- 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函数-因此,每当将子项添加到集合时,都可以设置模型属性。