是否有可能在棱角应用程序中对模型进行反思,在那里您可以更改范围并遍历它?像巴达朗这样的东西,但这将允许改变值。
如果不是,它是否是猴子补丁角码(通过在页面中包含另一个脚本)将使它成为可能?
发布于 2014-05-12 21:24:14
1.访问/调整作用域属性
角的$scope对象是简单的老JS对象,因此可以用标准的方式操作它们。
例如,someScope.someProp检索属性值,而someScope.someProp = someValue则设置属性值。
2.让角知道
修改对象的属性是一回事--使角度意识到变化是另一回事。
在运行$digest循环之前,角不会知道我们的修改。如果我们想立即应用更改,可以通过使用$digest来解释触发someScope.$apply()循环。
3.获取范围
为了获得与DOM元素关联的作用域的引用,我们需要对相应的DOM节点对象进行引用,将其包装在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); }
}例如,要遍历整个作用域树,可以使用以下代码段:
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);
}发布于 2014-05-12 13:58:17
找到了这个方法,这里有一个代码,它改变了角之外的作用域:
var $scope = angular.element($('.section:eq(0)')).scope();
$scope.$apply(function() {
scope.color = "blue";
});angular.element().scope()将返回范围并可进行调查。不确定如何遍历范围树,但这是一个很好的起点。如果没有作用域遍历,您只需遍历DOM并检查该DOM元素是否有新的作用域。
发布于 2014-05-12 17:53:24
您可以通过对由scope()返回的对象调用angular.element() (或者$(),如果也使用jQuery) (例如angular.element(".foo").scope() )的方法来获得作用域。没有直接访问子范围的方法。但是,知道所有具有与它们关联的新范围的元素都有ng-scope类,您可以转而遍历元素树。
$(".foo").find(".ng-scope").each(function() {
var scope = $(this).scope();
});然而,这可能有点棘手,因为find()会找到.foo下面的所有节点,而不管它们的深度如何。您可以使用children(),但它可能不会产生任何结果,因为.foo的直接后代可能不会创建新的作用域。
https://stackoverflow.com/questions/23540950
复制相似问题