我正在尝试通过常规函数访问全局变量,这可能吗?
我已经使用$ rootScope设置了一些变量,并且我试图通过回调函数来访问它。从控制器调用此回调。我不想传递$rootScope该回调。
$rootScope
有什么办法可以访问$rootScope.var吗?
$rootScope.var
我愿意使用服务。
请提出建议。
谢谢
我试图按以下方式访问rootScope:
function fbLandingCtrl($scope, $rootScope) { $rootScope.isFBLoggedin = false; $scope.login = function() { console.log( $rootScope.isFBLoggedin); fbHelper.login(getUserInfo); }; function getUserInfo(){ fbHelper.getUserInfo(updateStatus); } function updateStatus(userInfo){ $rootScope.isFBLoggedin = true; console.log( $rootScope.isFBLoggedin); } }
我的服务是:
myapp.factory('FBService', [ '$rootScope', function ($rootScope) { $rootScope.isFBLoggedin = false; // global variable $rootScope.userName = null; $rootScope.userEmail = null; return { getStatus: function() { return $rootScope.isFBLoggedin; }, setStatus: function(status) { console.log("Status:"+status); return $rootScope.isFBLoggedin = status; } }; }]);
它在updateStatus fn下显示isFBLoggedin为true,但未反映在视图上
我正在打印,{{isFBLoggedin}}但显示错误
{{isFBLoggedin}}
终于它的工作了。
我遵循@dluz的解决方案。
我也曾经$rootScope.$apply(function() {}})渲染过视图
$rootScope.$apply(function() {}})
请不要使用$ rootScope定义任何函数-这确实是不好的做法。请记住,$ rootScope毕竟是全局变量。
您可以通过以下服务获得$ rootScope:
<!doctype html> <html lang="en" ng-app="myApp"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script> <script> var myApp = angular.module('myApp', []); myApp.controller('myAppCtrl', ['$scope', 'myService', function ($scope, myService) { console.log(myService.getData()); }]) myApp.factory('myService', [ '$rootScope', function ($rootScope) { return { getData: function() { return $rootScope; } }; }]) </script> </head> <body ng-controller="myAppCtrl"> </body> </html>
$ rootScope存在,但可以用于邪恶
Angular中的范围形成了一个层次结构,典型地继承自树顶部的根范围。通常这可以忽略不计,因为大多数视图都有自己的控制器,因此也有自己的作用域。 有时,有些数据要对整个应用程序进行全局处理。对于这些,您可以像其他作用域一样注入$ rootScope并在其上设置值。由于作用域是从根作用域继承而来的,因此这些值将可用于附加到ng-show之类的指令的表达式,就像本地$ scope上的值一样。 当然,全局状态很糟糕,您应该谨慎使用$ rootScope,就像(希望)使用任何语言的全局变量一样。特别是,不要将其用于代码,而仅用于数据。如果您想在$ rootScope上放置一个函数,最好总是将其放在可以在需要的地方注入并且更容易测试的服务中。 相反,请勿创建仅在生命中唯一目的是存储和返回数据位的服务。
Angular中的范围形成了一个层次结构,典型地继承自树顶部的根范围。通常这可以忽略不计,因为大多数视图都有自己的控制器,因此也有自己的作用域。
有时,有些数据要对整个应用程序进行全局处理。对于这些,您可以像其他作用域一样注入$ rootScope并在其上设置值。由于作用域是从根作用域继承而来的,因此这些值将可用于附加到ng-show之类的指令的表达式,就像本地$ scope上的值一样。
当然,全局状态很糟糕,您应该谨慎使用$ rootScope,就像(希望)使用任何语言的全局变量一样。特别是,不要将其用于代码,而仅用于数据。如果您想在$ rootScope上放置一个函数,最好总是将其放在可以在需要的地方注入并且更容易测试的服务中。
相反,请勿创建仅在生命中唯一目的是存储和返回数据位的服务。
更新的答案
A_J,我不确定您的应用程序是什么情况。我需要查看更多代码才能为您提供更好的答案,但是请看下面的代码。也许它可以使您了解如何设计代码以$rootScope在.NET中访问service。
service
按下“登录我”按钮,然后查看您的控制台。这里的工作示例(http://jsbin.com/olOyaHa/1/)
<!doctype html> <html lang="en" ng-app="myApp"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js"></script> <script> var myApp = angular.module('myApp', []); myApp.controller('fbLandingCtrl', ['$scope', '$rootScope', 'loginService', function ($scope, $rootScope, loginService) { $rootScope.isFBLoggedin = false; $scope.login = function() { console.log('Current login status', $rootScope.isFBLoggedin); console.log(loginService.getUserInfo()); loginService.login(loginService.getUserInfo()); loginService.updateStatus(); }; }]); myApp.factory('loginService', [ '$rootScope', function ($rootScope) { return { login: function() { console.log('now I am logged in!'); return $rootScope.isFBLoggedin = true; }, getUserInfo: function() { return { username: 'xmen', role: 'admin', logged: 'false' }; }, updateStatus: function(userInfo){ $rootScope.isFBLoggedin = true; console.log('Current login status', $rootScope.isFBLoggedin); } }; }]) </script> </head> <body ng-controller="fbLandingCtrl"> <button ng-click="login()">Log Me In</button> </body> </html>