AngularJS 1.5中的组件不会从$ scope侦听广播事件

时间:2016-09-01 09:10:45

标签: javascript angularjs broadcast

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

    (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 () { };
    }
})();

事件“状态改变”&#39;在$ 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(&#39; 1&#39;);我无法发现这第一个状态。听取进一步的状态。

2 个答案:

答案 0 :(得分:2)

我不确定您是否遇到了与我类似的问题,在这种情况下,我希望我的发现会对您有所帮助。我的问题的完整描述以及我找到的解决方案是here

简而言之,我在使用$transitions时遇到了一些问题,我发现,对于版本1.0.0.beta1,tofrom参数无效。< / p>

所以,而不是

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

我正在使用

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

答案 1 :(得分:1)

我会指出四件事:

1)'*'是一个glob模式,它匹配根级别的任何状态,但它与子状态不匹配。使用双星'**'来匹配子状态。 ui-router glob文档分散且不太好,抱歉。

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

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

  

所有属性都是可选的。如果省略任何属性,则将其替换为值true,并始终匹配。

2)如果在控制器中创建一个钩子,则应该在销毁控制器范围时取消注册该钩子。

var deregisterFn = $transitions.onBefore(...)
$scope.$on('$destroy', deregisterFn);

3)如果在初始化控制器之前(在onSuccess挂钩注册之前)正在进行转换,则不会捕获初始转换。您可以从$state.transition&amp;&amp ;;中加入正在进行的转换承诺。 $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