Javascript 访问角模板元素
我想知道访问主html模板元素的正确方法是什么。我可以使用getelementbyid,也可以使用attr.$$element[0]访问它,但不知道是否有更干净的方法。在下面的示例中,我想要与getElementById行等效的代码Javascript 访问角模板元素,javascript,angularjs,Javascript,Angularjs,我想知道访问主html模板元素的正确方法是什么。我可以使用getelementbyid,也可以使用attr.$$element[0]访问它,但不知道是否有更干净的方法。在下面的示例中,我想要与getElementById行等效的代码 var app = angular.module('test', []); app.directive('test', function(){ return { restrict: 'E', template: '<canvas id="t
var app = angular.module('test', []);
app.directive('test', function(){
return {
restrict: 'E',
template: '<canvas id="test-canvas"></canvas>',
replace: true,
link: function(scope, elem, attr) {
// what is angular way of doing this?
var canvas = initCanvas(document.getElementById("test-canvas")),
// this works - is this recommended method?
var canvas = attr.$$element[0];
}
};
});
var-app=angular.module('test',[]);
应用指令('测试',函数(){
返回{
限制:'E',
模板:“”,
替换:正确,
链接:功能(范围、要素、属性){
//这样做的方式是什么?
var canvas=initCanvas(document.getElementById(“测试画布”),
//这很有效-这是推荐的方法吗?
var canvas=attr.$$element[0];
}
};
});
您应该像这样使用elem
param:
var canvas = elem;
正如注释中提到的,它是一个jqLite(jQuery)
wrapped元素
或
获取原始元素
如果您想访问子元素并对其进行处理,应该使用angular.element
。Angular使用jqLite
,它提供有限的jQuery
方法。您可以在此处进一步阅读:。例如,在jqLite
中,只能将find()
与标记名选择器一起使用,因此,如果要按id选择子项,则应使用如下内容:
angular.element(elem[0].querySelector('#your_child')).bind('click', () => {
elem.toggleClass('some_class');
}
elem.find('#your_child').click(() => {
elem.toggleClass('some_class');
});
如果您使用的是jQuery,您可以使用find()
,那么代码如下所示:
angular.element(elem[0].querySelector('#your_child')).bind('click', () => {
elem.toggleClass('some_class');
}
elem.find('#your_child').click(() => {
elem.toggleClass('some_class');
});
试用console.log(elem)
您将看到它是什么。希望这有帮助
注意:假设您想从ng repeat
指令中选择子元素。以前的解决方案不起作用,因为这些元素还不存在。您只需添加$timeout
,如下所示:
function yourDirective($timeout) {
return {
...
link: function (scope, elem, attrs) {
$timeout(() => {
angular.element(elem[0].querySelectorAll('.your_child')).bind('click', () => {
// Do something
}
});
}
}
}
angular
.module('yourApp')
.directive('yourDirective', yourDirective);
您应该像这样使用
elem
param:
var canvas = elem;
正如注释中提到的,它是一个jqLite(jQuery)
wrapped元素
或
获取原始元素
如果您想访问子元素并对其进行处理,应该使用angular.element
。Angular使用jqLite
,它提供有限的jQuery
方法。您可以在此处进一步阅读:。例如,在jqLite
中,只能将find()
与标记名选择器一起使用,因此,如果要按id选择子项,则应使用如下内容:
angular.element(elem[0].querySelector('#your_child')).bind('click', () => {
elem.toggleClass('some_class');
}
elem.find('#your_child').click(() => {
elem.toggleClass('some_class');
});
如果您使用的是jQuery,您可以使用find()
,那么代码如下所示:
angular.element(elem[0].querySelector('#your_child')).bind('click', () => {
elem.toggleClass('some_class');
}
elem.find('#your_child').click(() => {
elem.toggleClass('some_class');
});
试用console.log(elem)
您将看到它是什么。希望这有帮助
注意:假设您想从ng repeat
指令中选择子元素。以前的解决方案不起作用,因为这些元素还不存在。您只需添加$timeout
,如下所示:
function yourDirective($timeout) {
return {
...
link: function (scope, elem, attrs) {
$timeout(() => {
angular.element(elem[0].querySelectorAll('.your_child')).bind('click', () => {
// Do something
}
});
}
}
}
angular
.module('yourApp')
.directive('yourDirective', yourDirective);
如果要访问“主html模板元素”,只需使用
elem
param。它已经是对模板根元素的引用。在link函数中,elem
是一个jQuery(或jQuery lite)包装的DOM元素,对应于该指令所操作的元素。但是,在某些情况下,这可能是原始元素的副本,这对于您的需要可能很重要,也可能不重要。在这些罕见的情况下,您可以通过指令的compile
函数获得实际的原始元素。它是元素,但与其他选项返回的格式不同,对我来说不可用-在我的情况下,我想做一些画布工作,需要调用canvas.getContext('2d')-getContext不是elem的函数。因为elem
是jQuery包装的元素elem[0]
返回已包装的原始元素。看啊!!我明白了-它看起来不像Angular有.get()函数,所以我想elem[0]是满足我需要的方法。如果您将您的评论作为答案发布,我会将其标记为已接受。如果您想访问“主html模板元素”,只需使用elem
param。它已经是对模板根元素的引用。在link函数中,elem
是一个jQuery(或jQuery lite)包装的DOM元素,对应于该指令所操作的元素。但是,在某些情况下,这可能是原始元素的副本,这对于您的需要可能很重要,也可能不重要。在这些罕见的情况下,您可以通过指令的compile
函数获得实际的原始元素。它是元素,但与其他选项返回的格式不同,对我来说不可用-在我的情况下,我想做一些画布工作,需要调用canvas.getContext('2d')-getContext不是elem的函数。因为elem
是jQuery包装的元素elem[0]
返回已包装的原始元素。看啊!!我明白了-它看起来不像Angular有.get()函数,所以我想elem[0]是满足我需要的方法。如果你把你的评论作为回答,我会把它标记为接受。