0

アプリには、動的なレイアウトを示す mainRegion があります。ルーティングの問題とレイアウトへのアクセス、およびその更新のコンボの問題がありますpizzaTypeRegion。このレイアウトは list_controller.js.coffee で作成され、pizzaTypeNameRegion(ピザの種類の名前を保持) とpizzaTypeRegion(ピザの種類の詳細を表示) があります。pizzaTypeRegionurl: を手動で編集するときにを更新したいと思いますhttp://localhost:3000/#pizza_types。#pizza_types は、期待どおりにすべての Pizza_types を示しています。

のリンクをクリックすると、問題なく適切なコンテンツで がpizzaTypeNameRegion更新されます。pizzaTypeRegion

URL に Pizza_type の ID を手動で入力する場合:

http://localhost:3000/#pizza_types/1- 最初のピザの種類を表示する必要がありますが、pizzaTypeRegion

http://localhost:3000/#pizza_types/2- 2 番目のピザの種類を表示する必要がありますが、pizzaTypeRegion

特定の Pizza_type がコンソールへのロギングを介して取得されたという証拠を得ています。

Pizza_types_app.js.coffee

@Pizzeria.module "PizzaTypesApp", (PizzaTypesApp, App, Backbone, Marionette,$, _) ->
  @startWithParent = false

  class PizzaTypesApp.Router extends Marionette.AppRouter
    appRoutes:
      "pizza_types" : "listPizzaTypes"
      "pizza_types/:id" : "showPizzaType"

  API =

   listPizzaTypes: ->
     PizzaTypesApp.List.Controller.listPizzaTypes()

   showPizzaType: (model) ->   
     PizzaTypesApp.Show.Controller.showPizzaTypeFromEvent model     


  App.on "pizzaTypes:show", ->
    App.navigate "pizza_types"
    API.listPizzaTypes()

  App.addInitializer ->
    new PizzaTypesApp.Router
      controller: API

  App.reqres.setHandler "show:pizza:type:view", (model) ->
    API.showPizzaType model

  App.reqres.setHandler "show:first:pizzaType:view", ->
    API.showFirstPizzaType()

list_controller.js.coffee

@Pizzeria.module "PizzaTypesApp.List", (List, App, Backbone, Marionette, $, _) ->

      List.Controller =

        listPizzaTypes: ->
          pizzaTypes = App.request "get:pizza:types:entities"
          pizzaType = gon.pizza_type
          @layout = new List.Layout

          @layout.on "show", =>
            @pizzaTypeNameRegion pizzaTypes
            @pizzaTypeRegion()

          App.mainRegion.show @layout

        pizzaTypeNameRegion: (pizzaTypes) ->
          pizzaTypesNameView = new List.PizzaTypeNames
            collection: pizzaTypes
          @layout.pizzaTypeNameRegion.show pizzaTypesNameView

          pizzaTypesNameView.on "itemview:show:pizza:type", (childView, pizzaType) =>
            @newPizzaTypeRegion(pizzaType)

        pizzaTypeRegion: ->
          initialPizzaTypeView = App.request "show:first:pizzaType:view"
          @layout.pizzaTypeRegion.show initialPizzaTypeView

        newPizzaTypeRegion: (pizzaType) ->
          newPizzaTypeView = App.request "show:pizza:type:view", pizzaType.id
          @layout.pizzaTypeRegion.show newPizzaTypeView

show_controller.js.coffee

@Pizzeria.module "PizzaTypesApp.Show", (Show, App, Backbone, Marionette, $, _) ->

  Show.Controller =

    showPizzaTypeFromEvent: (model) ->
      pizzaType = App.request "pizzaType:entity", model
      pizzaTypeView = new Show.PizzaType
        model: pizzaType
      App.mainRegion.show pizzaTypeView  
      # mainRegion is updated with whatever the url is 
      # ex)`http://localhost:3000/#pizza_types/2` will 
      # place the pizza_type with the id of 2 in the 
      # App's mainRegion, breaking the layout that I 
      # set up in the list_controller.js.coffee. Browser back and forward
      # buttons work, but layout is broken, missing other regions (and their info)

pizzaTypeRegion新しいピザの種類でを更新するにはどうすればよいですか? pizzaTypeRegionURL を手動で入力してレイアウト内の他の領域に影響を与えずに、list_controller で作成されたレイアウト インスタンスにアクセスして新しいコンテンツで更新する方法はありますか?

**編集**

  • 上記のコードを取り除き、すべてを元に戻して、懸念事項の分離を維持できるようにしました。グローバルではなく、イベントバスを使用することになりました

:

リストコントローラー:

newPizzaTypeRegion: (pizzaType) ->
  id = pizzaType.id
  App.vent.on "new:pizza:type:for:pizza:type:region", (pizzaTypeView) =>
    @layout.pizzaTypeRegion.show pizzaTypeView

show_controller:

showPizzaTypeFromEvent: (id) ->
  pizzaType = App.request "pizzaType:entity", id
  pizzaTypeView = new Show.PizzaType
    model: pizzaType
  App.vent.trigger "new:pizza:type:for:pizza:type:region", pizzaTypeView

List.Controller は自分自身を更新する方法を知っており、Show.Controller は List.Controller に更新するコンテンツを伝えます。うまく機能し、非常にクリーンで、分離されています。

4

2 に答える 2

0

具体的な事例に依存するため、適切な答えを出すことは困難です。基本的に、次の 2 つのオプションがあります。

  • アクセス可能な場所にレイアウトをアタッチします (必ずしもグローバルである必要はありません。たとえば、サブアプリケーション レベルである可能性があります)。
  • イベントを使用して変更に反応し、レイアウト/ビューを更新する

このレイアウトを複数のビューで使用している場合に調査すべきもう 1 つのことは、サブアプリケーションのイニシャライザ内でインスタンス化し、複数のコントローラからアクセスできるようにどこかにアタッチすることです (サブアプリなど)。

于 2013-09-06T07:07:13.430 に答える
0

私の Pizza_types_app.js.coffee サブモジュールでは:

@Pizzeria.module "PizzaTypesApp", (PizzaTypesApp, App, Backbone, Marionette,$, _) ->
  @startWithParent = false

  # took this out of the list_view    
  class PizzaTypeName extends Backbone.Marionette.ItemView
    template: "pizza_types/list/templates/_pizza_type_name"
    modelEvents:
      "change" : "render"

    events:
      "click a" : "showPizzaType"

    showPizzaType: (event) ->
      @trigger "show:pizza:type", @model
      @model     

  class PizzaTypeNames extends Backbone.Marionette.CompositeView
    template: "pizza_types/list/templates/pizza_type_names"
    itemView: PizzaTypeName

  # took this out of the list_view 
  class DefaultLayout extends Backbone.Marionette.Layout
    template: "pizza_types/list/templates/pizza_types_layout"
    regions:
      pizzaTypeNameRegion : "#pizza-type-name-region"
      pizzaTypeRegion : "#pizza-type-region"

  App.addInitializer ->
    @layout = new DefaultLayout
    Pizzeria.PizzaTypesApp.layout = @layout
    App.mainRegion.show @layout

    @layout.on "show", =>
      pizzaTypes = App.request "get:pizza:types:entities"   
      pizzaTypesNameView = new PizzaTypeNames
        collection: pizzaTypes

      @layout.pizzaTypeNameRegion.show pizzaTypesNameView 
      @layout.pizzaTypeRegion

  class PizzaTypesApp.Router extends Marionette.AppRouter
    appRoutes:
      "pizza_types" : "listPizzaTypes"
      "pizza_types/:id" : "showPizzaType"


  API =

   listPizzaTypes: ->
     PizzaTypesApp.List.Controller.listPizzaTypes()

   showPizzaType: (id) ->   
     PizzaTypesApp.Show.Controller.showPizzaTypeFromEvent id

   showFirstPizzaType: ->
     PizzaTypesApp.Show.Controller.showFirstPizzaType()

  App.on "pizzaTypes:show", ->
    App.navigate "pizza_types"
    API.listPizzaTypes()

  App.addInitializer ->
    new PizzaTypesApp.Router
      controller: API

  App.reqres.setHandler "show:pizza:type:view", (model) ->
    API.showPizzaType model

  App.reqres.setHandler "show:first:pizzaType:view", ->
    API.showFirstPizzaType()

show_controller.js.coffee

@Pizzeria.module "PizzaTypesApp.Show", (Show, App, Backbone, Marionette, $, _) ->

  Show.Controller =

    showPizzaTypeFromEvent: (id) ->
      pizzaType = App.request "pizzaType:entity", id
      pizzaTypeView = new Show.PizzaType
        model: pizzaType
      pizzaTypeView

      @layout = Pizzeria.PizzaTypesApp.layout
      App.mainRegion.show @layout
      @layout.pizzaTypeRegion.show pizzaTypeView

list_controller.coffee.js

@Pizzeria.module "PizzaTypesApp.List", (List, App, Backbone, Marionette, $, _) ->

  List.Controller =

    listPizzaTypes: ->
      pizzaTypes = App.request "get:pizza:types:entities"
      pizzaType = gon.pizza_type
      @layout = Pizzeria.PizzaTypesApp.layout #new List.Layout

      @layout.on "show", =>
        @pizzaTypeRegion()

      App.mainRegion.show @layout

    pizzaTypeNameRegion: (pizzaTypes) ->
      pizzaTypesNameView = new List.PizzaTypeNames
        collection: pizzaTypes
      @layout.pizzaTypeNameRegion.show pizzaTypesNameView

      pizzaTypesNameView.on "itemview:show:pizza:type", (childView, pizzaType) =>
        @newPizzaTypeRegion(pizzaType)

    pizzaTypeRegion: ->
      initialPizzaTypeView = App.request "show:first:pizzaType:view"
      @layout.pizzaTypeRegion.show initialPizzaTypeView

    newPizzaTypeRegion: (pizzaType) ->
      newPizzaTypeView = App.request "show:pizza:type:view", pizzaType.id
      @layout.pizzaTypeRegion.show newPizzaTypeView


    getPizzaTypeNameView: (pizzaTypes) ->
      new List.PizzaTypeNames
        collection: pizzaTypes

    getPizzaTypeLayout: ->
      new List.Layout
于 2013-09-06T17:20:05.713 に答える