Javascript 获取范围';s元素在指令之外
有没有一个技巧可以让与作用域关联的元素在拥有它的指令之外 我的行为前提是必须在最不利的条件下进行(从控制台或Greasemonkey脚本)。例如,获取具有范围的元素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
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';
})
}