无法从其中一个控制器访问绑定到$ rootScope的authData

时间:2015-02-06 19:26:02

标签: angularjs angularfire rootscope

我有一个让我疯狂的错误,基本上我所要做的就是设置一个$rootScope.authData属性,该属性包含用户的身份验证信息,以便我可以在不同的控制器中使用它。

然而,当我尝试这个时,它只是给我一个错误,说$rootScope.authData没有定义。我已经检查过,确实是从mainCtrl将其登录到控制台时定义的,但是从undefined将其登录到控制台时它是tagsCtrl

考虑到我可以在我的其他控制器中使用$rootScope.authData,这很奇怪..而且如果我在$rootScope.test = 'testing'中添加mainCtrl并在控制台日志中添加tagsCtrl $rootScope.authData它有效。

我看不出有什么不对的,我已经在这里完成了,我已经走到了尽头。有什么想法吗?

设置flickrApp.controller('mainCtrl', ['$scope', '$rootScope', '$firebase', 'Auth', function($scope, $rootScope, $firebase, Auth) { Auth.$onAuth(function(authData) { $rootScope.authData = authData; console.log($rootScope.authData); //Is defined here }); }]); 的主控制器:

$rootScope.authData

无法访问flickrApp.controller('tagsCtrl', ['$scope', '$rootScope', '$firebase', function($scope, $rootScope, $firebase) { console.log($rootScope.authData); //Is not defined here }]); 的控制器:

flickrApp.service('shared', ['$scope', 'Auth', function($scope, Auth) {

    //Auth is a wrapper that points to my firebase reference

    Auth.$onAuth(function(authData) {
        return $scope.authData = authData;
    });
}]);

编辑:在得到Bricktop的一些反馈意见后,我尝试为此创建一项服务,结果如下:

Error: [$injector:unpr] http://errors.angularjs.org/1.3.10/$injector/unpr?p0=%24scopeProvider%20%3C-%20%24scope%20%3C-%20shared
at Error (native)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:6:417
at https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:38:307
at Object.d [as get] (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:36:308)
at https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:38:381
at d (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:36:308)
at e (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:37:64)
at Object.instantiate (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:37:213)
at Object.<anonymous> (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:37:490)
at Object.e [as invoke] (https://ajax.googleapis.com/ajax/libs/angularjs/1.3.10/angular.min.js:37:96)

我不确定这是否有效,但似乎不是因为我收到此错误:

flickrApp.controller('tagsCtrl', ['$scope', '$firebase', 'shared', function($scope, $firebase, shared) {

    console.log($scope.authData.uid); //This would come from the 'shared' service now
}]);

我这样注射:

{{1}}

这里有什么问题?

2 个答案:

答案 0 :(得分:1)

以上answer解释了为什么它(可能)不起作用,但我建议您以不同的方式解决问题(在控制器之间共享变量)。

您应该创建一个服务(类似于&#34;共享&#34;)并以这种方式共享数据。这是有效的,因为服务是单例,而控制器则不是。此外,即使您不需要,您也不会在您的rootcope中添加变量。

要查看此类共享服务检查的一个很好的示例here.

以下是我的示例,该示例适用于您的示例:

首先是共享服务:

flickrApp.service('shared', function() {

    var authentication = 'none';

    return {
        getAuth: function () {
                return authentication;
        },
        setAuth: function (auth) {
            authentication = auth;
        }
    };
});

我喜欢将此共享服务从所有逻辑中清除,并仅将其用于共享数据。

接下来是主控制器,你必须确保在登录后调用任何其他控制器之前实际调用它(所以你会把它放在一个处理登录的控制器中!)

flickrApp.controller('mainCtrl', ['$scope', '$firebase', 'shared', 'Auth', function($scope, $firebase, Auth, shared) {

    Auth.$onAuth(function(authData) {
        shared.setAuth(authData);
        console.log(shared.getAuth()); //Check if it was set correctly
    });
}]);

最后需要检查登录状态的任何其他控制器:

flickrApp.controller('tagsCtrl', ['$scope', '$firebase', 'shared', function($scope, $firebase, shared) {
    $scope.auth = shared.getAuth();
    if($scope.auth === 'none'){
      console.log('you are not logged in!');
    }else{
        console.log('welcome '+$scope.auth.uid);
        //anything you would do if a user is logged in
    }
}]);

我假设你知道以下内容,但我只想重复一遍(我对firebase不熟悉):

始终要注意,javascript代码可能会被恶意用户操纵,请确保您向发送到服务器的每个http请求发送用户令牌,以确保用户实际登录并且不依赖在javascript上为你做这个。

如果您有任何其他问题,请告诉我。

答案 1 :(得分:0)

这是一个通过共享服务和范围共享数据的简单示例

<强> JS

(function(app) {

    function SharedService() {
        this.user = {};
    }

    function Controller1(scope, SharedService) {
        scope.sharedService = SharedService;
    }

    function Controller2(scope, SharedService) {
        scope.sharedService = SharedService;
    }

    app.service('SharedService', SharedService);
    app.controller('Controller1', Controller1);
    app.controller('Controller2', Controller2);

})(angular.module('myApp', []));

<强> HTML

<script src="https://code.angularjs.org/1.3.4/angular.js"></script>
<script type="text/javascript" src="js/exp2/app.js"></script>
<div ng-app="myApp">
    <div ng-controller="Controller1 as ctrl">
        </br> 
        <table>
            <tr>
                <td><B> Enter Age in Controller1</B></td>
                <td><input type="text" ng-model="ctrl.userAge"></select></td>
            </tr>
        </table>
    </div>
    <div ng-controller="Controller2 as ctrl">
        <table>
            <tr>
                <td><B> Age in controller2 : </B></td>
                <td>{{ctrl.userAge}}</td>
            </tr>
        </table>
    </div>
</div>

参考以下链接,了解如何在不使用任何范围的情况下共享数据。 http://plnkr.co/edit/den1mfMeIAWezLTuVZVX?p=preview