这总是令我困惑,并且想知道什么,如何,为什么,以及何时我们在编写单元测试时都会使用。
var $rootScope;
beforeEach(inject(function(_$rootScope_) {
$rootScope = _$rootScope_;
}));
var $scope;
beforeEach(inject(function(_$scope_) {
$scope= _$scope_;
}));
答案 0 :(得分:5)
第二种方法将失败。由于注入器中不存在$scope
服务(与$rootScope提供程序相对),因此无法注入$scope
。如果需要从rootScope创建子作用域,请注入$ rootScope并执行$scope = $rootScope.$new()
;
实施例: -
var $rootScope, $scope, $isolatedScope;
beforeEach(inject(function(_$rootScope_) {
$rootScope = _$rootScope_;
$scope = _$rootScope_.$new(); //inherited scope
$isolatedScope = _$rootScope_.$new(true) //isolated scope
}));
// .....
beforeEach(function(){
$controller('myControllThatUsesScope', {$scope:$scope});
});
$scope
通常是一个动态或特殊的依赖项,它被注入一个角度实体(如控制器,指令链接函数)。这就是为什么当您使用$controller
服务实例化控制器(具有对$ scope的依赖)时,您需要在本地中显式提供$scope
而不是其他依赖项(如服务)在注入器中可用,类似地,您需要使用$rootScope
来访问服务中的范围方法,例如事件api。
更具体地说明你的问题:
$rootScope
并在需要时创建子范围。$scope
但你可以注射$rootScope