1.访问/修改范围属性
Angular 的 $scope 对象是普通的旧 JS 对象,因此可以通过标准方式进行操作。
例如。 someScope.someProp 检索属性的值,而someScope.someProp = someValue 设置属性的值。
2。让 Angular 知道
修改对象的属性是一回事 - 让 Angular 意识到更改是另一回事。
Angular 在运行 $digest 循环之前不会知道我们的修改。如果我们想立即应用更改,我们可以使用someScope.$apply() 显式触发$digest 循环。
3.掌握范围
为了获得对与 DOM 元素关联的作用域的引用,我们需要对对应的 DOM Node 对象有一个引用,将其包装在angular.element 中并执行其scope() 方法。
像这样的:
<body class="ng-scope">
var someScope = angular.element(document.body).scope();
此外,如果我们想访问$rootScope(所有作用域的父作用域),我们可以使用注入器来注入$rootScope服务:
<html ng-app="myApp">
var injector = angular.element(document.documentElement).injector();
var rootScope = injector.get('$rootScope');
4.遍历范围树
一旦我们得到一个作用域对象,我们可能想要遍历作用域树。每个作用域都具有以下属性(除其他外):
-
$parent:此范围的父范围(如果有)。
-
$$nextSibling:此范围的下一个同级范围(如果有)。
(同级作用域是具有相同$parent 的作用域)
-
$$childHead:此范围的第一个子范围(如果有)。
为了遍历以someScope为根的作用域树的分支:
var scopes = [someScope];
while (scopes.length) {
var scope = scopes.shift();
console.log(scope);
if (scope.$$nextSibling) { scopes.unshift(scope.$$nextSibling); }
if (scope.$$childHead) { scopes.unshift(scope.$$childHead); }
}
例如要遍历整个作用域树,可以使用以下 sn-p:
var injector = angular.element(document.body).injector();
var rootScope = injector.get('$rootScope');
var scopes = [rootScope];
while (scopes.length) {
var scope = scopes.shift();
report(scope);
if (scope.$$nextSibling) { scopes.unshift(scope.$$nextSibling); }
if (scope.$$childHead) { scopes.unshift(scope.$$childHead); }
}
function report(scope) {
var str = '' + scope.$id;
while (scope.$parent) {
str = scope.$parent.$id + ' => ' + str;
scope = scope.$parent;
}
console.log(str);
}