如何在angularjs中使用另一个控制器中的控制器中定义的函数

时间:2014-08-29 03:06:06

标签: javascript angularjs angularjs-scope angularjs-controller

我有2个控制器,loginCtrl和regCtrl,登录控制器$ scope.login里面有一个函数,我想从我的regCtrl里面调用这个函数。 我想要实现的是将用户重定向到他的主页,而无需在注册成功后登录。 loginCtrl中的登录功能

 $scope.login=function(){
        NProgress.start();
        singInClicked = true;
        var request =$http({
              withCredentials: true,
              method:"post",
              url: "http://localhost:1337/auth/login",
              data: {
                    user_identifier: $scope.user_identifier,
                    password: $scope.password
              }
        });
and the code of the regCtrl where i want to call this function is 

request.success(
        function(data){
            $scope.response=data;
            console.log("you have registered successfully");
            //serviceStatus($http);
            //**call $scope.login here**
            NProgress.done();
        });

我如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

一种方法是在您的reg控制器中注入$controller服务,在创建$ controller时分配新范围,并使用该范围在loginCtrl上调用该函数。

app.controller('regCtrl', ['$scope', '$controller', function($scope, $controller) {

    var loginCtrlVM = $scope.$new(); //Create a new scope
    //var loginCtrlVM = $scope.$new(true);  //Or even an isolated scope

    $controller('loginCtrl', {$scope:loginCtrlVM }); //Instantiate loginCtrl passing in the scope

     request.success(function(data){
        ...
        console.log("you have registered successfully");

        loginCtrlVM.login(); //<--- Now call login from your own scope

        NProgress.done();
    });

}]);

另一种方法是将逻辑抽象为单独的服务并在两个控制器中使用它,或者甚至在检查用户是否已登录的公共路由逻辑中(您的注册服务也可以通过调用执行登录操作)用于设置登录状态的登录服务)。这样您就不必在控制器中具有这种依赖性。你似乎在一个控制器中有NProgress.start();而在另一个控制器中有NProgress.done();(可能我没有看到整个代码),这使得它看起来很意大利面。