2013-11-14 135 views
4

感謝SO社區的一些很好的幫助,我有一個工作角度SPA,使用ui-router庫使用多個狀態/視圖。不過,我得到的行爲似乎與angular-ui-router文檔不一致。角度ui路由器onEnter功能沒有射擊

從自己的文件約onEnter,我希望,任何時候我用$state.go("home"),該onEnter()事件綁定到該州的配置對象將揭開序幕,但我沒有看到這一點。例如:

/* myApp module */ 
var myApp = angular.module('myApp', ['ui.router']) 
.config(['$stateProvider', function ($stateProvider) { 

$stateProvider.state('home', { 
    url: "/", 
    views: { 
     'top': { 
      url: "", 
      template: '<div>top! {{topmsg}}</div>', 
      controller: function ($scope) { 
       $scope.topmsg = "loaded top!"; 
       console.log("top ctrl!"); 
      }, 
      onEnter: function() { 
       console.log("entered bottom state's onEnter function"); 
      } 
     }, 
     'middle': { 
      url: "", 
      template: '<div>middle! {{middlemsg}}</div>', 
      controller: function ($scope) { 
       $scope.middlemsg = "loaded middle!"; 
       console.log("middle ctrl!"); 
      }, 
      onEnter: function() { 
       console.log("entered bottom state's onEnter function"); 
      } 
     }, 
     'bottom': { 
      url: "", 
      template: '<div>bottom! {{bottommsg}}</div>', 
      controller: function ($scope) { 
       $scope.bottommsg = "loaded bottom!"; 
       console.log("bottom ctrl!"); 
      }, 
      onEnter: function() { 
       console.log("entered bottom state's onEnter function"); 
      } 
     } 
    }, 
    onEnter: function() { 
     console.log("entered home state"); 
    } 
    }); 
}]) 
.controller('MyAppCtrl', function ($scope, $state/*, $stateParams*/) { 
    $scope.statename = $state.current.name; 
    $scope.testmsg = "app scope working!"; 
    console.log("MyAppCtrl initialized!"); 
    $state.go("home"); 
}); 

你可以從所有國家的配置對象的onEnter()通話時看到,我的期望是,當家庭狀態的負載,我會開始看到的一切,他們打州/視圖的列表發射他們的控制檯消息。但是,從home狀態的onEnter事件中只記錄第一個entered home state消息。沒有其他視圖的onEnter正在被擊中。我誤解了文檔嗎?

Here is a long-awaited fiddle來演示。只需在Firebug/chrome devtools中顯示控制檯,您將看到缺少控制檯輸出。

任何幫助將是偉大的。我使用angular 1.2和ui-router 0.2.0。提前致謝!

+0

這將是一個更容易調試工作示例(即Plunkr)。 –

+0

@NateAbele對不起,花了這麼長時間,但任何有興趣的人都可以找到小提琴。謝謝! – tengen

+0

您也可以考慮使用[$ scope events](http://stackoverflow.com/questions/16094940/what-is-the-lifecycle-of-an-angularjs-controller)而不是使用路由器之一。 –

回答

20

兩件事情:

  • onEnter方法適用於狀態,不意見。您的定義中包含一個狀態和三個視圖,出於某種原因,您嘗試將URL附加到您的視圖中。

  • 爲了進入狀態,首先必須退出。 (A)你永遠不會離開home狀態(因爲你只有一個狀態定義開始),所以你永遠不會重新輸入它。 (B)看起來你實際上正試圖在home內創建子狀態。即使你修正了你的語法,它仍然不起作用,因爲當你進入一個父代的子狀態時,通過改變到同一父代中的一個不同的子狀態,你仍然不會離開父狀態,觸發onEnter