Как да изпратя модел, върху който е щракнато в рамките на ItemView, до друг ItemView, който е на същата страница?

Имам колекция от инструменти, показвана като CompositeView. Всеки от изобразените елементи в тази колекция е ItemView. Името на региона, който ги съдържа, се нарича toolNameRegion.

Имам друг регион с име toolDetailsRegion в тази страница и той трябва да рендира атрибутите на кликнатия инструмент в toolNameRegion.

Ето гледката:

@Tools.module "AboutApp.Show", (Show, App, Backbone, Marionette, $, _) ->

  class Show.Layout extends Backbone.Marionette.Layout
    template: JST['backbone/apps/about/templates/about']

    regions:
      toolNameRegion:  "#tool-name"
      toolDetailsRegion: "#tool-details"

  class Show.Tool extends Backbone.Marionette.ItemView
    template: JST['backbone/apps/about/templates/_tool']
    tagName: "li"

    events:
      "click a.tool-link" : -> 
        @trigger "tool-name:link:clicked", @model # How the hell do I pass this to the Show.ToolDetail class?
        console.log @model # shows the model attributes that was clicked

  class Show.Tools extends Backbone.Marionette.CompositeView
    template: JST['backbone/apps/about/templates/tools']
    itemView: Show.Tool
    itemViewContainer: "ul"

    triggers:
      "click .tool-link" : "tool:link:clicked"

  class Show.ToolDetail extends Backbone.Marionette.ItemView
    template: JST['backbone/apps/about/templates/tool_details']
    itemView: Show.Tool

    onShow: -> console.log "onShow"
    onClose: -> console.log "onClose"

Ето контролера:

@Tools "AboutApp.Show", (Show, App, Backbone, Marionette, $, _) ->

  Show.Controller =

    showAbout: ->
      tools = App.request "get:tools"
      @aboutLayout = @getAboutLayout()

      @aboutLayout.on "show", =>
        @showTools tools
        @showInitialTool tools

      App.mainRegion.show @aboutLayout

    showTools: (tools) ->
      toolsView = @getToolsView tools   
      console.log toolsView

      toolsView.on "tool:link:clicked", (tool) =>
        console.log "model: #{tool}"
        tool = @getInitialToolView tool
        @aboutLayout.toolDetailsRegion.show tool

    @aboutLayout.toolNameRegion.show toolsView


  getToolsView: (tools) ->
    new Show.Tools
      collection: tools

  showInitialTool: (tools) ->
    initial_tool = tools.at(1) 
    toolView = @getInitialToolView initial_tool
    @aboutLayout.toolDetailsRegion.show toolView

  getToolDetailsView:  ->
    App.request "tool:detail:view"

  toolDetailsRegion: ->
    toolDetailView = @getInitialToolView 
    @about.toolDetailsRegion.show toolDetailView

  getInitialToolView: (tool) ->
    new Show.ToolDetail
      model: tool

  getAboutLayout: ->
    new Show.Layout

Как да предам @model (модела, върху който е щракнато) към контролера, така че @model да може да бъде предаден на класа на изглед Show.ToolDetail, така че toolDetailsRegion да може да се актуализира динамично?

Ето моите обекти (ресурси):

@Tools.module "Entities", (Entities, App, Backbone, Marionette, $, _) ->

  class Entities.Tool extends Backbone.Model

  class Entities.ToolCollection extends Backbone.Collection
    model: Entities.Tool
    url: -> Routes.tools_path()

  API =

    setTools: (tools) ->
      new Entities.ToolCollection (tools)

    getToolEntities: ->
      tools = new Entities.ToolCollection()
      tools.fetch
        reset: true
      tools

    App.reqres.setHandler "set:tools", (tools) ->
      API.setTools tools

    App.reqres.setHandler "tool:entities", ->
      API.getToolEntities()

Благодаря за отговора @David Sulc. Все още не преминава през модела. Може би не го форматирам правилно?

Начинът, по който хващам модела от изгледа:

class Show.Tool extends Backbone.Marionette.ItemView
  template: JST['backbone/apps/about/templates/_tool']
  tagName: "li"

  events:
    "click a.tool-link" : -> 
      App.request "get:new:tool", @model
      console.log @model

В контролера:

 showTools: (tools) ->
    toolsView = @getToolsView tools   
    console.log toolsView

    toolsView.on "tool:link:clicked", (tool) =>
      console.log "model retrieved from click: #{tool}" # comes up undefined; how to obtain?
      tool = App.request "get:new:tool" # could this be the path, but since tool is undefined, won't work? 
      new_tool = @getInitialToolView tool
      @aboutLayout.toolDetailsRegion.show new_tool

  @aboutLayout.toolNameRegion.show toolsView

Благодаря на @David Sulc, че ми показа пътя!

В контролера:

  showTools: (tools) ->
    toolsView = @getToolsView tools   
    console.log toolsView

    Tools.AboutApp.Show.on "tool-name:link:clicked", (tool) =>
      console.log tool.get('name')
      new_tool = @getInitialToolView tool
      @aboutLayout.toolDetailsRegion.show new_tool 

В кода за преглед:

  class Show.Tool extends Backbone.Marionette.ItemView
    template: JST['backbone/apps/about/templates/_tool']
    tagName: "li"

    events:
      "click a.tool-link" : -> 
        Tools.AboutApp.Show.trigger "tool-name:link:clicked", @model
        console.log @model

  class Show.ToolDetail extends Backbone.Marionette.ItemView
    template: JST['backbone/apps/about/templates/tool_details']
    itemView: Show.Tool
    Tools.AboutApp.Show.on "tool-name:link:clicked", (tool) =>
      console.log tool

    onShow: -> console.log "onShow"
    onClose: -> console.log "onClose"

person Joe C    schedule 09.05.2013    source източник
comment
Благодаря за отговора Тези събития за цялото приложение ще бъдат ли в модула с инструменти? Или в контролера? Или в оформлението?   -  person Joe C    schedule 10.05.2013


Отговори (1)


Можете да използвате събития, обхванати от текущия ви модул. Задействайте събитието във вашия изглед с

Tools.AboutApp.Show.trigger "my:event", @model

След това във вашия контролер можете да слушате това събитие и да актуализирате другия си изглед:

Tools.AboutApp.Show.on "my:event", (model) ->
    console.log model

Синтаксисът, който сте използвали в изгледа Show.Tools, ще бъде ограничен по обхват до изгледа на елемент (и до известна степен неговия изглед на колекция). Тъй като трябва да предавате данни между различни изгледи, трябва да разширим обхвата и следователно да използваме извикването както по-горе: задействане и слушане за събития в обхвата Tools.AboutApp.Show.

Според вас:

events:
  "click a.tool-link" : -> 
    Tools.AboutApp.Show.trigger "tool-name:link:clicked", @model

И във вашия подробен изглед:

Tools.AboutApp.Show.on "tool-name:link:clicked", (tool) =>
  console.log "model retrieved from click: #{tool}"

Забележете, че трябва да използваме същия обхват и същото име на тригер.

person David Sulc    schedule 10.05.2013
comment
Благодаря за отговора @David Sulc. Все още не преминава през модела. - person Joe C; 10.05.2013
comment
Актуализирах отговора си. Изглежда, че не използвате правилния обхват на събитието и имената ви на тригери са непоследователни. - person David Sulc; 10.05.2013
comment
прав си за обхвата и кодът, който поставих по-горе относно: именуване на събитието, беше прибързан от моя страна. Почти стигнах и веднага щом го накарам да заработи, ще маркирам отговора като приет. Благодаря ти за помощта! - person Joe C; 10.05.2013
comment
благодаря за помощта ... моделът преминава перфектно и вашият отговор е маркиран като приемлив. Сега трябва да разбера синтаксиса, за да актуализирам изгледа с подробности ... ха-ха - person Joe C; 10.05.2013