我正在尝试广播以切换当前正在显示的视图,但是当我更改控制器的模型时,ng-show不会更改以反映新的状态。

我正在使用$rootScope.$broadcast("registerFormShow", username, password)告诉RegisterForm控制器我希望它可见。它在ng-show中有一个变量register.active,但似乎没有应用更改。我试过从$scope.$apply()回调中调用$on,但是angular抛出一个异常,说$apply is already in progress。任何想法为什么会这样?

这是我的一些代码:


app.controller("LoginController", ["$http", "$rootScope", function($http, $rootScope){

    this.openRegister = function(username, password){
        $rootScope.$apply(function(){
            $rootScope.$broadcast("register", username, password);
        });
        this.loggedIn = true;
        console.log("register even sent");
    }

}]);
app.controller("RegisterController", ["$http", "$scope", function($http, $scope){
    this.active = false;
    $scope.$on("register", function(username, password){
        this.active = true;
    }
}]);


HTML:

<div ng-controller="RegisterController as register" ng-show="register.active" class="cover">
        <div class="form register-form" ng-class="{indeterminate: register.indeterminate}">

            <input type="text" name="username" required="" ng-model="username" />
            <input type="password" required="" ng-model="password" />
            <button ng-click="register.register(username, password)">Register</button>
        </div>
    </div>


这是演示此问题的演示的链接:http://jsfiddle.net/7LLa7zot/1/

最佳答案

我会尝试

 this.active = false;
 var _this = this;
    $scope.$on("register", function(username, password){
        _this.active = true;
    }


不知道这是否是问题,但您永远不会在javascript中知道这是什么。

这已修复了提琴手,因此很可能是您的问题。因此,如果您看不到它的原因是您在寄存器中使用了不正确的“ this”。

08-19 00:03