2015-04-23 92 views
6

我試圖在Angular ui-router的父狀態中執行一些初始化代碼。初始化代碼是orderService.getStoreInfo(),它返回一個承諾。只有當這個承諾解決了,我是否想要觸發子狀態。但是,我注意到,甚至在父母的承諾解決之前,孩子的狀態就會被觸發。我究竟做錯了什麼?這裏有我的代碼:ui-router在父狀態解決之前觸發子狀態

function configure($stateProvider, $urlRouterProvider) { 

    $urlRouterProvider.otherwise('/'); 

    $stateProvider 
     .state('home', { 
      abstract: true, 
      template: '<ui-view/>', 
      resolve: { 
       storeInfo: /* @ngInject */ function(orderService) { 
        console.log('home: resolve - orderService.getStoreInfo()'); 
        return orderService.getStoreInfo(); 
       } 
      } 
     }) 

     .state('home.orders', { 
      url: '^/', 
      template: '<my-order-list data-orders="vm.orders"></my-order-list>', 
      resolve: { 
       orders: /* @ngInject */ function (orderService) { 
        console.log('home.orders: resolve - orderService.getOrders()'); 
        return orderService.getOrders(); 
       } 
      }, 
      controller: ['orders', function (orders) { 
       this.orders = orders; 
      }], 
      controllerAs: 'vm', 
     }); 
} 

控制檯日誌如下:

home: resolve - orderService.getStoreInfo() 
home.orders: resolve - orderService.getOrders() 
... messages from orderService.getStoreInfo() ... 

這清楚地表明,雙親狀態已得到解決甚至在孩子狀態射擊。

+0

據我所知,推遲決心的唯一方法是不返回承諾。 – Claies

+0

您是否嘗試將'storeInfo'顯式注入子狀態的解析函數?不知道它是否有幫助,只是好奇。 –

+0

@Yauheni Leichanok,這正是問題!我重新閱讀ui-router文檔,並明確指出:「如果您想在實例化子代之前等待承諾解決,必須將解析密鑰注入到子狀態中。」所以謝謝。如果您將您的建議作爲答案,我會將其標記爲正確答案。謝謝! – Naresh

回答

7

答案是hereresolve鍵必須注入到子狀態中,如果您想在實例化子元素之前等待承諾解決。所以只需明確地將storeInfo注入到子狀態的解析函數中即可。

+0

謝謝!這正是問題所在。 – Naresh