首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJS模型内省/反思

AngularJS模型内省/反思
EN

Stack Overflow用户
提问于 2014-05-08 11:51:34
回答 3查看 3.1K关注 0票数 3

是否有可能在棱角应用程序中对模型进行反思,在那里您可以更改范围并遍历它?像巴达朗这样的东西,但这将允许改变值。

如果不是,它是否是猴子补丁角码(通过在页面中包含另一个脚本)将使它成为可能?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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()方法。

就像这样:

代码语言:javascript
复制
<body class="ng-scope">

var someScope = angular.element(document.body).scope();

此外,如果我们想访问$rootScope (所有作用域的父作用域),可以使用注入器注入$rootScope服务:

代码语言:javascript
复制
<html ng-app="myApp">

var injector = angular.element(document.documentElement).injector();
var rootScope = injector.get('$rootScope');

4.遍历范围树

一旦我们掌握了一个作用域对象,我们可能需要遍历范围树。每个作用域都具有以下属性(除其他外):

  • $parent:这个作用域的父作用域(如果有的话)。
  • $$nextSibling:这个作用域的下一个同级作用域(如果有的话)。 (兄弟作用域是具有相同$parent的作用域)
  • $$childHead:这个作用域的第一个子作用域(如果有的话)。

为了遍历以someScope为根的作用域树的分支:

代码语言:javascript
复制
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); }
}

例如,要遍历整个作用域树,可以使用以下代码段:

代码语言:javascript
复制
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);
}
票数 3
EN

Stack Overflow用户

发布于 2014-05-12 13:58:17

找到了这个方法,这里有一个代码,它改变了角之外的作用域:

代码语言:javascript
复制
var $scope = angular.element($('.section:eq(0)')).scope();
$scope.$apply(function() {
   scope.color = "blue";
});

angular.element().scope()将返回范围并可进行调查。不确定如何遍历范围树,但这是一个很好的起点。如果没有作用域遍历,您只需遍历DOM并检查该DOM元素是否有新的作用域。

票数 1
EN

Stack Overflow用户

发布于 2014-05-12 17:53:24

您可以通过对由scope()返回的对象调用angular.element() (或者$(),如果也使用jQuery) (例如angular.element(".foo").scope() )的方法来获得作用域。没有直接访问子范围的方法。但是,知道所有具有与它们关联的新范围的元素都有ng-scope类,您可以转而遍历元素树。

代码语言:javascript
复制
$(".foo").find(".ng-scope").each(function() {
  var scope = $(this).scope();
});

然而,这可能有点棘手,因为find()会找到.foo下面的所有节点,而不管它们的深度如何。您可以使用children(),但它可能不会产生任何结果,因为.foo的直接后代可能不会创建新的作用域。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23540950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档