2016-09-01 38 views
4

我遇到了这个问题,我无法弄清楚如何解决这个问题。我有这个组件:

(function() { 
    'use strict'; 

    // Usage: 
    // 
    // Creates: 
    // 

    myApp 
     .component('navbar', { 
      //template:'htmlTemplate', 
      templateUrl: 'app/components/navbar/navbar.partial.html', 
      controller: ControllerController, 
      bindings: { 
       progress: '<' 
      }, 
     }); 

    ControllerController.$inject = ['$scope','$rootScope','changeState']; 
    function ControllerController($scope,$rootScope,changeState) { 

     var $ctrl = this; 

     $scope.$on('state-changed',function(event,args){ 
      console.log(args); 
     }); 




     $ctrl.$onInit = function() { }; 
     $ctrl.$onChanges = function (changesObj) { }; 
     $ctrl.$onDestory = function() { }; 
    } 
})(); 

在$ transitions.onSuccess(ui-router 1.0 Beta)上触发事件'状态改变'。下面的代码:

var myApp = angular.module('myApp', ['ui.router']); 

myApp.controller('appCtrl', ['$scope', '$state', 'formDataService', '$timeout', '$transitions','changeState','$transitions', 
     function ($scope, $state, formDataService, $timeout, $transitions,changeState,$transitions) { 

     changeState.go('1'); 
     $scope.stateByFar = 1; 

     $scope.currentState = function(){ 
      return $state.current.name; 
     }; 

     $scope.updateStateByFar = function(){ 
      if (parseInt($scope.currentState())>$scope.stateByFar) 
       $scope.stateByFar=parseInt($scope.currentState()); 
     }; 



      $transitions.onSuccess({to: '*'}, function(){ 

       $scope.updateStateByFar(); 
       console.log($scope.stateByFar); 
       $scope.$broadcast('state-changed',{currentState: $scope.currentState(), 
                stateByFar : $scope.stateByFar}); 

      } 
      ); 




    }]); 

[编辑] 广播的实际工作。不能在第一个国家广播。当主模块运行时,第一条指令是:$ state.go('1');我无法检测到这第一个state.go。进一步state.go被聆听。

+0

你不是从riitscope广播?对 ? – DMCISSOKHO

回答

1

我将指出四两件事:

1)'*'是在匹配任何状态下的水珠图案根级别,但它不匹配子状态。也使用双星'**'来匹配子状态。 ui路由器glob文档分散且不太好,很抱歉。

更好的是,默认为:条件已经匹配任何状态,所以使用onSuccess({}, ...)

这是这里https://ui-router.github.io/docs/latest/interfaces/transition.hookmatchcriteria.html

记录所有属性都是可选的。如果任何属性被省略,它将被值替换为true,并且总是匹配。

2)如果你在控制器中创建一个钩子,当控制器作用域被销毁时,你应该注销该钩子。 3)如果在初始化控制器之前(和onSuccess挂接寄存器之前)正在进行转换,则不会捕获初始转换。您可以挂接到正在进行中的过渡承诺从$state.transition & & $state.transition.promise

4)传统$stateChange*事件仍然可用,但你必须申请加入。见https://ui-router.github.io/docs/latest/modules/ng1_state_events.html

有关迁移至1.0的更多信息,请参阅本指南:https://ui-router.github.io/guide/ng1/migrate-to-1_0

+0

谢谢。它真的澄清我的疑惑。 –

2

我不确定你是否遇到类似于我的问题,在这种情况下,我希望我的发现能够帮助你。我的问题的完整描述,我找到的解决方案是here

总之,我遇到一些问题,而使用$transitions,我发现,与1.0.0.beta1版本tofrom params不起作用。

所以,与其

$transitions.onSuccess({to: '*', form: '*'}, function(){}); 

我使用

$transitions.onSuccess({}, function(){ 
    if($state.current.name == 'myState') // do stuff 
}); 
+0

感谢您的快速回复,但看起来{{:'*'}不会影响我的路由。 –