我正在尝试通过常规函数访问全局变量,这可能吗?
我已经使用$ rootScope设置了一些变量,并且我试图通过回调函数来访问它。从控制器调用此回调。我不想传递$rootScope
该回调。
有什么办法可以访问$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}}
但显示错误
终于它的工作了。
我遵循@dluz的解决方案。
我也曾经$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上放置一个函数,最好总是将其放在可以在需要的地方注入并且更容易测试的服务中。相反,请勿创建仅在生命中唯一目的是存储和返回数据位的服务。
更新的答案
A_J,我不确定您的应用程序是什么情况。我需要查看更多代码才能为您提供更好的答案,但是请看下面的代码。也许它可以使您了解如何设计代码以$rootScope
在.NET中访问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>
如果可能的话,我愿意使用服务。 请建议。 谢谢 我还使用来呈现视图
问题内容: 我有上面的控制器,它设置了一个我只能从内部访问值的控制器。 但我看到的地方,使用下面我将能够访问,但是当我在它不存在。 我无法弄清楚如何访问$ scope并使用变量更新它。 问题答案: 没有看到标记,我想MenuSideController的作用域是您选择的作用域的子作用域。 虽然可以像这样遍历树(假设我们想要的作用域是第一个孩子): 仅选择连接了特定控制器的元素会更简单。 假设您正在
问题内容: 首先,我检查了一下,但没有发现涉及我的问题的文章。 如何在angularJS内置指令中访问预定义的js全局变量? 例如,我在 然后我写一个AngularJS指令: 这实际上是行不通的。 然后我得知我应该使用 所以我在其他地方写了代码: 而且这显然不能正常工作……这就像一个恶性循环。您需要访问预定义的js全局变量,然后需要使用ng-init;为了使用ng-init,您需要访问全局变量。
问题内容: 如何在其他.go包/文件中的main.go中访问已声明/初始化的变量?不断告诉我变量未定义(我知道全局变量不好,但这只是用作时间戳记) 在main.go中 尝试访问其他.go文件中的StartTime,但保持未定义StartTime 问题答案: 我将改为“注入” starttime变量,否则在软件包之间会有循环依赖关系。 main.go otherpackage.go
问题内容: 我写了下面的代码 我知道它在ng- controller之外,因此我无法绑定数据,但是我的应用程序需要calanderCtrl控制器。我想将此值置于范围内,以便我也可以在其他控制器中使用它。我该怎么做呢? 问题答案: 您可以为此使用发布订阅模式。这样,您避免将变量放在rootscope上。 模板加载时,控制器将被调用。 现在如何运作: Angular不共享范围。每个控制器都有自己的单独
问题内容: 我想在Chrome的JavaScript控制台中访问我的变量。我怎么做? 我既看不到控制台中的模块名称也看不到它的变量。 问题答案: 在开发人员工具的HTML面板中选择一个元素,然后在控制台中输入以下元素: 在WebKit和Firefox中,是对elements选项卡中所选DOM节点的引用,因此通过执行此操作,可以在控制台中打印出所选DOM节点范围。 您还可以按元素ID定位作用域,如下