【问题标题】:How to create a "boot" state which all other states much transition through?如何创建一个“启动”状态,所有其他状态都经过多次转换?
【发布时间】:2012-11-07 20:49:34
【问题描述】:

我正在构建一个具有持久视图的简单应用。这种观点一直存在。 视图取决于一些数据。以不同的状态进入应用程序应该 确保视图与它的数据一起存在。我认为最好的方法是做到这一点 将创建一个调用connectOulet 来连接数据和视图的初始状态。这样,所有后续状态都必须通过这一状态进行转换。我不知道如何让路由器在连接后自动转换到下一个状态。

这是我的路由器(这在 ATM 上不起作用)。见 cmets。

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 建模这种行为对我来说似乎是正确的。这是做这种事情的正确方法还是有更好的方法?

【问题讨论】:

  • 第一印象是没有根节点。您只能有一个根,所有其他子节点都嵌套在它下面。启动和根状态都处于根级别

标签: ember.js ember-old-router


【解决方案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

【讨论】:

    【解决方案2】:

    您应该能够在根路由中调用 connectOutlets。我认为您不能像您的示例那样在 root 之上或之前创建路由/状态。

    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
    

    【讨论】:

    • 我已经发布了我的解决方案。根据文档,root 状态是“不可路由的”。我试图打电话给connectOutlet,但尚未定义控制器。我认为这是因为“不可路由”评论。我不确定这意味着什么。无论哪种方式,我的答案都如我所愿。
    猜你喜欢
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多