Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 获取范围';s元素在指令之外_Javascript_Angularjs_Angularjs Scope - Fatal编程技术网

Javascript 获取范围';s元素在指令之外

Javascript 获取范围';s元素在指令之外,javascript,angularjs,angularjs-scope,Javascript,Angularjs,Angularjs Scope,有没有一个技巧可以让与作用域关联的元素在拥有它的指令之外 我的行为前提是必须在最不利的条件下进行(从控制台或Greasemonkey脚本)。例如,获取具有范围的元素 angular.element(document.querySelector('.ng-scope')).scope().$$childTail 没有DOM遍历 我想可以遍历所有ng scope和ng隔离scopeDOM元素并映射它们的作用域,但我正在寻找更优雅的解决方案(映射也需要保持最新,并且我正在尝试远离domsubtree

有没有一个技巧可以让与作用域关联的元素在拥有它的指令之外

我的行为前提是必须在最不利的条件下进行(从控制台或Greasemonkey脚本)。例如,获取具有范围的元素

angular.element(document.querySelector('.ng-scope')).scope().$$childTail
没有DOM遍历

我想可以遍历所有
ng scope
ng隔离scope
DOM元素并映射它们的作用域,但我正在寻找更优雅的解决方案(映射也需要保持最新,并且我正在尝试远离
domsubtreemeding
,而且这在
已启用调试信息
已禁用的情况下不起作用).

作用域不保留对与其关联的元素的引用。毕竟,作用域可以不与特定元素关联而存在

$compile负责将元素与作用域相关联

编译过程的一部分扩展了元素,允许您从元素>>范围(例如
angular.element(“#某物”).scope()
)开始。在作用域中似乎不会发生同样的情况

因此,要转到另一种方式,scope>>元素,必须映射作用域ID:。Angular JS Batarang中允许您从页面中选择一个元素并检查与其关联的范围的功能?就是这样做的。巴塔朗使用角度暗示。angular提示使用
ng scope
类遍历页面上的所有元素,并返回具有匹配作用域id的元素

函数findElt(scopeId){
var elts=document.querySelectorAll('.ng scope');
变量,范围;
对于(变量i=0;i
要获得指令的元素,您可以做一些事情

    <yourDirective   elementclicked="MyFunction(event)" ....>
事件元素

如果需要在事件上传递该元素,可以创建一个回调,该回调可以将该元素传递回。如果您不需要一直引用它,那么这是首选方法

在指令的return对象中,添加如下内容

    scope:{
      elementclicked: "&"
    }
在指令的模板中,可以添加

    <....... ng-click="ElementClicked(event)"........>
现在,您可以像其他方法一样将回调传递给指令

    <yourDirective   elementclicked="MyFunction(event)" ....>
这将监视何时绑定设置并设置元素属性。这里最大的缺点是将属性附加到传递的对象上,但是如果它是针对指令内部的指令,或者它只是您的项目,则应该可以


另一种方法是使用第一个方法,创建elementlinked(element)回调,并在链接作用域后启动它。

据我所知,您希望在指令之外访问作用域的值。我做了一个小样本,检查一下:

HTML部分:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script data-require="angular.js@1.3.x" src="https://code.angularjs.org/1.3.15/angular.js" data-semver="1.3.15"></script>

  <div id="outer" ng-app="plunker" ng-controller="MainCtrl">
    You are {{msg}}
</div>
<div onclick="change()">click me</div> 
//自定义java脚本

function change() {
    var scope = angular.element($("#outer")).scope();
    scope.safeApply(function(){
        scope.msg = 'Superhero';
    })
}

对于上面的代码工作,Plunker链接在这里:

如果您知道元素的id,您根本不需要作用域。让我重新表述一下问题,您使用的是Batarang吗?当然,但“最不利条件”实际上意味着它不存在。我想知道Batarang是否会遍历DOM并观察其更新以将其映射到作用域。让我困惑的是,在什么情况下您会有作用域Id。用例有助于形成答案。没错,我认为我无法编辑它们,但必须在运行时劫持它们@Dave Alperovich,谢谢,我已经自己编写了这个函数(下面的答案也很明确),但由于DOM的更改,我对结果不满意。答案很有描述性,但它回答了问题的主题,而不是问题本身。我以前用类似的方法修改过DOMSubtree,但在性能上有问题,希望变异观察员、缓存和节流能有所帮助。谢谢你用有角度的提示来改进答案,我忽略了。
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script data-require="angular.js@1.3.x" src="https://code.angularjs.org/1.3.15/angular.js" data-semver="1.3.15"></script>

  <div id="outer" ng-app="plunker" ng-controller="MainCtrl">
    You are {{msg}}
</div>
<div onclick="change()">click me</div> 
var app = angular.module('plunker', []);

    app.controller('MainCtrl', function($scope, $rootScope) {
     $scope.msg = "great";
        $rootScope.safeApply = function( fn ) {
            var phase = this.$root.$$phase;
            if(phase == '$apply' || phase == '$digest') {
                if(fn) {
                    fn();
                }
            } else {
                this.$apply(fn);
            }
        };
    });
function change() {
    var scope = angular.element($("#outer")).scope();
    scope.safeApply(function(){
        scope.msg = 'Superhero';
    })
}