1

永続的なビューを備えたシンプルなアプリを構築しています。このビューは常にあります。ビューはいくつかのデータに依存します。別の状態でアプリケーションに入ると、ビューがそのデータとともに存在することを確認する必要があります。connectOuletこれを行う最良の方法は、データとビューを接続するために呼び出す初期状態を作成することだと思いました。そうすれば、後続のすべての状態がこの状態を移行する必要があります。接続後にルーターを自動的に次の状態に移行させる方法がわかりません。

これが私のルーターです(これはATMでは機能しません)。コメントを参照してください。

Inbox.Router = Ember.Router.extend
  enableLogging: true
  location: "history"
  initialState: "bootUp"

  bootUp: Ember.Route.extend
    root: Ember.Route.extend
      route: '/'
      # All states need to transition through this code
      # How can I transition to root state after this code executes?
      connectOutlets: (router, context) ->
        router.get('applicationController').connectOutlet
          outletName: "list"
          name: "messages"
          context: Inbox.store.findAll(Inbox.Message)

  root: Ember.Route.extend
    showMessage: Ember.Route.transitionTo('root.showingMessage')

    initialState: 'dashboard'

    dashboard: Ember.Route.extend
      route: '/dashboard'

    # Entering this state needs the messages view loaded
    # with data
    showingMessage: Ember.Route.extend
      route: '/:id'
      connectOutlets: (router, context) ->
        router.get('applicationController').connectOutlet
          outletName: "details"
          name: "message"
          context: context
      serialize: (router, context) ->
        id: context.get('id')
      deserialize: (router, urlParams) ->
        Inbox.store.find Inbox.Message, urlParams.id

FSMを使用してこの動作をモデル化することは、私には正しいように思われます。これはそのようなことをする正しい方法ですか、それとももっと良い方法がありますか?

4

2 に答える 2

1

解決策は、物事が遷移する状態ルート状態を作成することです。root状態自体はルーティングできません。したがって、このためのサブステートを作成する必要があります。これが私のルーターです。

# Assume users enters a /

Inbox.Router = Ember.Router.extend
  enableLogging: true
  location: "history"

  # Root application state
  root: Ember.Route.extend

    # This is the state that the others must transition.
    # It's route is "/". It has a nested state called "home"
    # which route is "/". Home's route is relative to "/". 
    # So when a user enters at "/" the "home" state is selected.
    # The router transitions into "index" then "home".
    # When the user enters at "/:id" the user transitions through "index"
    # since "/:id" is a subroute of "/".
    # 
    # This is explained in the router's nested state documentation.
    index: Ember.Route.extend
      route: '/'
      connectOutlets: (router, context) ->
        router.get('applicationController').connectOutlet
          outletName: "list"
          name: "messages"
          context: Inbox.store.findAll(Inbox.Message)
        router.get('applicationController').connectOutlet
          outletName: "details"
          name: "message"
        router.get('applicationController').connectOutlet
          outletName: "filters"
          controller: router.messagesController
          viewClass: Inbox.FiltersView

      showMessage: Ember.Route.transitionTo('showingMessage')

      home: Ember.Route.extend
        route: '/'

      showingMessage: Ember.Route.extend
        route: '/:id'
        connectOutlets: (router, context) ->
          router.get('messageController').set('content', context)
        serialize: (router, context) ->
          id: context.get('id')
        deserialize: (router, urlParams) ->
          Inbox.store.find Inbox.Message, urlParams.id
于 2012-11-14T22:49:48.793 に答える
0

ルート ルートで connectOutlets を呼び出すことができるはずです。あなたの例のように、ルートの上または前にルート/状態を作成できるとは思いません。

root: Ember.Route.extend
showMessage: Ember.Route.transitionTo('root.showingMessage')
initialState: 'dashboard'

connectOutlets: (router) ->
  router.get('applicationController').connectOutlet
    outletName: "list"
    name: "messages"
    context: Inbox.store.findAll(Inbox.Message)

dashboard: Ember.Route.extend
  route: '/dashboard'

# Entering this state needs the messages view loaded
# with data
showingMessage: Ember.Route.extend
  route: '/:id'
  connectOutlets: (router, context) ->
    router.get('applicationController').connectOutlet
      outletName: "details"
      name: "message"
      context: context
  serialize: (router, context) ->
    id: context.get('id')
  deserialize: (router, urlParams) ->
    Inbox.store.find Inbox.Message, urlParams.id
于 2012-11-08T00:08:31.450 に答える