如何使用$rootScope我想稍后在另一个控制器中访问的控制器中存储变量?例如:
angular.module('myApp').controller('myCtrl', function($scope) {
var a = //something in the scope
//put it in the root scope
});
angular.module('myApp').controller('myCtrl2', function($scope) {
var b = //get var a from root scope somehow
//use var b
});
Run Code Online (Sandbox Code Playgroud)
我该怎么做?
试图找到AngularJS的一些基本信息$rootScope.$broadcast,但AngularJS文档没有多大帮助.简单来说,我们为什么要使用它?
此外,在John Papa的Hot Towel模板中,公共模块中有一个名为的自定义函数$broadcast:
function $broadcast() {
return $rootScope.$broadcast.apply($rootScope, arguments);
}
Run Code Online (Sandbox Code Playgroud)
我不明白这是做什么的.所以这里有几个基本问题:
1)做$rootScope.$broadcast什么?
2)$rootScope.$broadcast和之间有什么区别$rootScope.$broadcast.apply?
我问这个问题是因为我不太清楚如何将rootcope视为传递给指令的依赖
我有一个指令,需要显示来自$ rootScope的一些信息......
我以为我需要将$ rootScope传递给一个指令但是当我写这样的指令时它似乎有效.
.directive("myBar", function () {
return {
restrict: "E",
transclude: true,
replace: true,
template: '<div>' +
'<span ng-transclude></span>' +
'{{rsLabels.welcome}} {{rsUser.firstName}}!' +
'</div>'
}
})
Run Code Online (Sandbox Code Playgroud)
我什么时候需要这样做?
.directive("myBar", function ($rootScope) {
return {
restrict: "E",
transclude: true,
replace: true,
template: '<div>' +
'<span ng-transclude></span>' +
'{{rsLabels.welcome}} {{rsUser.firstName}}!' +
'</div>'
}
})
Run Code Online (Sandbox Code Playgroud)
如果我需要在指令的link函数中使用rootScope,我可以使用rootScope吗?或者我应该在指令的控制器中执行它?
.directive("myBar", function ($rootScope) {
return {
restrict: "E",
transclude: true,
replace: true,
link: function (scope, element, attrs, rootScope) {
rootScope.rsUser = { firstName: 'Joe' …Run Code Online (Sandbox Code Playgroud) 我的应用程序初始化$ rootScope中的对象图,就像这样......
var myApp = angular.module('myApp', []);
myApp.run(function ($rootScope) {
$rootScope.myObject = { value: 1 };
});
Run Code Online (Sandbox Code Playgroud)
...然后从该对象图中消耗数据(仅限单向绑定),就像这样......
<p>The value is: {{myObject.value}}</p>
Run Code Online (Sandbox Code Playgroud)
这工作正常,但如果我随后(在页面渲染完成后)尝试更新$ rootScope并用新的替换原始对象,则会被忽略.我最初认为这是因为AngularJS保留了对原始对象的引用,即使我已经替换它.
但是,如果我将消耗的HTML包装在控制器中,我能够以预期的方式重复更新其范围,并且修改将正确地反映在页面中.
myApp.controller('MyController', function ($scope, $timeout) {
$scope.myObject = { value: 3 };
$timeout(function() {
$scope.myObject = { value: 4 };
$timeout(function () {
$scope.myObject = { value: 5 };
}, 1000);
}, 1000);
});
Run Code Online (Sandbox Code Playgroud)
有没有办法通过$ rootScope实现这一点,还是只能在控制器内完成?此外,是否有更推荐的模式来实施此类操作?具体来说,我需要一种方法来替换AngularJS从AngularJS代码之外使用的完整对象图.
蒂姆,提前谢谢你的建议
编辑:正如评论中所建议的,我已经尝试在$ apply中执行更改,但它没有帮助:
setTimeout(function() {
var injector = angular.injector(["ng", "myApp"]);
var rootScope = injector.get("$rootScope");
rootScope.$apply(function () {
rootScope.myObject = { …Run Code Online (Sandbox Code Playgroud) 点击按钮时广播事件: -
$scope.onButtonClick = function(){
$rootScope.$broadcast('onButtonClick');
}
Run Code Online (Sandbox Code Playgroud)
并在另一个控制器中捕捉事件: -
$rootScope.$on('onButtonClick',function(event){
alert("catched");
console.log(event);
});
Run Code Online (Sandbox Code Playgroud)
但即使只开了一次,它也抓了两次.这是为什么?
我是棱角分明的新人.我正在使用一个获取对象列表并在第一页上显示它们的服务.然后根据点击的对象,我在下一页设置标签页眉.但是当我刷新页面时,列表的范围将丢失,并且选项卡标题会抛出异常,导致页面不显示信息.有没有办法保留即使刷新第二页时在前一个屏幕上点击了哪个对象的信息?
我正在研究Angularjs的FEQ,我在下面的文章中看过:
$ rootScope存在,但它可以用于邪恶
Angular中的作用域形成一个层次结构,原型继承自树顶部的根作用域.通常这可以忽略,因为大多数视图都有自己的控制器,因此也有范围.
有时,您希望为整个应用程序提供全局数据.对于这些,您可以
$rootScope像任何其他范围一样在其上注入和设置值.由于范围继承自根范围,因此这些值可用于附加到指令的表达式,就像ng-show本地的值一样$scope.当然,全球国家很糟糕,你应该
$rootScope谨慎使用,就像你希望用任何语言的全局变量一样.特别是,不要将它用于代码,只用于数据.如果您想要开启一个功能$rootScope,那么将它放在一个可以在需要的地方注入并且更容易测试的服务几乎总是更好.相反,不要创建一个服务,其唯一目的是存储和返回数据位.
所以我怀疑为什么$ rootScope不建议用作全局函数?有任何性能问题吗?
在控制器中,我定义了$rootScope.tableformate变量来填充弹出窗口中的数据.
填充后$rootScope.tableformate不使用弹出数据.如何删除这个变量?
这是状态配置:
angular
.module('grabhutApp', [...])
.config(function ($stateProvider, $urlRouterProvider) {
$stateProvider
// ACCOUNT
.state('account', {
abstract: true,
url: '/account',
templateUrl: 'index.html'
})
.state('account.main', {
url: '',
templateUrl: 'views/account/account.login.html',
controller: 'AccountController'
})
.
.
.
// NO VIEWS
.state('nv', {
abstract: true,
url: '/nv'
})
.state('nv.logout', {
url: '/logout'
})
});
Run Code Online (Sandbox Code Playgroud)
在nv和其子状态不会有任何物理视图或控制器.
我希望它们作为调用某些功能的链接.
调用注销方法的服务:
angular.module('grabhutApp')
.factory('$grabhutAccountService', function ($state, $grabhutDataService) {
var methods = {
.
.
logoutUser: function () {
$grabhutDataService.user.removeSession();
$state.go('account.main', {}, {location: 'replace'});
}
.
.
};
return methods; …Run Code Online (Sandbox Code Playgroud) 用户注销后,我需要清理我的$ rootScope.我试过$rootScope.$destroy()但是没有做到这一点.有没有办法循环遍历$ rootScope中的所有值并删除它们或简单地重置它的方法?