Angularjs 从配置中访问控制器变量

Angularjs 从配置中访问控制器变量,angularjs,Angularjs,如何访问控制器中与my.config位于同一文件中的变量?我试图在加载以下视图之前验证用户当前是否登录: 'use strict'; // Declare app level module which depends on views, and components angular.module('myApp', [ 'ngRoute', 'ngStorage', 'ui.router', 'myApp.userView', 'myApp.usuarios' ]) .co

如何访问控制器中与my.config位于同一文件中的变量?我试图在加载以下视图之前验证用户当前是否登录:

'use strict';

// Declare app level module which depends on views, and components
angular.module('myApp', [
  'ngRoute',
  'ngStorage',
  'ui.router',
  'myApp.userView',
  'myApp.usuarios'
])

.controller("MainCtrl",['$scope','$localStorage',function($scope,$localStorage) {

  $scope.user =  {}

  $scope.save = function(u) {
    $localStorage.user = u;
  };

  $scope.load = function() {
    $scope.user = $localStorage.user;
    console.log($scope.user);
  };

  $scope.logoff= function() {
    $localStorage.$reset();
    $scope.load();
  };

  $scope.loginPage= function() {

    var path = "/login/";
    window.location.href = path;
  };

  $scope.load();


}])

.config(function($stateProvider, $urlRouterProvider) {


    $urlRouterProvider.otherwise('/home');
   // $urlRouterProvider.otherwise('/404');

    $stateProvider

    .state('userView', {
        url: '/users_config',
        templateUrl: 'resources/userView/userView.html',
            controller: 'userViewCtrl',
        resolve: {
           security: ['$q', function($q){
               if($scope.user == null){
                 $state.go("401");
               }
           }]
        }
    })

    .state('404', {
        url: '{path:.*}',
        templateUrl: 'resources/errorView/404.html'
    })

    .state('401', {
        url: '{path:.*}',
        templateUrl: 'resources/errorView/401.html'
    });

});

我想在userView状态下访问$scope.user,以决定何时加载它。任何指针都将受到欢迎。

您不能在状态解析后创建$scope


使用存储当前用户的服务或使用$rootScope。

您不能这样做,$scope是在状态解析后创建的


可以使用存储当前用户的服务,也可以使用$rootScope。

将登录逻辑实现为一种很好的做法,例如:

.factory("login_service", function ($http, $q) {
    var isLogged = false;

    function login(username, password) {
        var deferred = $q.defer();

        $http.post("/login", { username: username, password: password })
            .then(function (result) {
                if(result.data.error == 0) {
                    isLogged = true;
                    deferred.resolve(result.data);
                } else {
                    isLogged = false;
                    deferred.reject(error);
                }
            }, function (error) {
                isLogged = false;
                deferred.reject(error);
            });

        return deferred.promise;
    }
    function isLogged() {
        return isLogged;
    }
    return {
        login: login,
        logout: logout,
        isLogged: isLogged
    };
});
因此,您可以在所有
控制器中、在状态的
解析功能中、在应用程序的
.run()
方法中注入
login\u服务
并使用其方法(登录、注销、isLogged)

您最终可以在
.run()
中实现登录检查,如下所示:

app.run(function ($rootScope, $state, login_service) {

  $rootScope.$on('$stateChangeStart', function (event, toState, toParams) {
    event.preventDefault();
    if (login_service.isLogged()==false) {
        $state.go("login");
    } else {
        $state.go(toState.name, toParams);
    }
  });

});
一些有用的链接:


将登录逻辑实现为一种很好的做法,例如:

.factory("login_service", function ($http, $q) {
    var isLogged = false;

    function login(username, password) {
        var deferred = $q.defer();

        $http.post("/login", { username: username, password: password })
            .then(function (result) {
                if(result.data.error == 0) {
                    isLogged = true;
                    deferred.resolve(result.data);
                } else {
                    isLogged = false;
                    deferred.reject(error);
                }
            }, function (error) {
                isLogged = false;
                deferred.reject(error);
            });

        return deferred.promise;
    }
    function isLogged() {
        return isLogged;
    }
    return {
        login: login,
        logout: logout,
        isLogged: isLogged
    };
});
因此,您可以在所有
控制器中、在状态的
解析功能中、在应用程序的
.run()
方法中注入
login\u服务
并使用其方法(登录、注销、isLogged)

您最终可以在
.run()
中实现登录检查,如下所示:

app.run(function ($rootScope, $state, login_service) {

  $rootScope.$on('$stateChangeStart', function (event, toState, toParams) {
    event.preventDefault();
    if (login_service.isLogged()==false) {
        $state.go("login");
    } else {
        $state.go(toState.name, toParams);
    }
  });

});
一些有用的链接:

在解决方案中使用a在解决方案中使用a