Javascript 使用AngularJS获取元素,而不引用文档
我一直在用AngularJS开发一个高级的基于web的GUI。最近,我决定使用callJavascript 使用AngularJS获取元素,而不引用文档,javascript,angularjs,Javascript,Angularjs,我一直在用AngularJS开发一个高级的基于web的GUI。最近,我决定使用calldocument.getElementsByClassName()(我讨厌使用元素收集方法,但在这里我不得不使用一种方法),我的老板打开盖子访问文档元素。他说我“只需要对所有东西使用角度调用”,甚至对元素集合也是如此!是否有一种按类名收集元素的“角度方法”?如果是这样,在角度框架内使用哪种方法更好?请提供原因。谢谢 更新:为什么我需要使用元素收集器… 所以,我真的希望我不必这么做,但我确实 我使用的是我在网上找
document.getElementsByClassName()
(我讨厌使用元素收集方法,但在这里我不得不使用一种方法),我的老板打开盖子访问文档
元素。他说我“只需要对所有东西使用角度调用”,甚至对元素集合也是如此!是否有一种按类名收集元素的“角度方法”?如果是这样,在角度框架内使用哪种方法更好?请提供原因。谢谢
更新:为什么我需要使用元素收集器…
所以,我真的希望我不必这么做,但我确实
我使用的是我在网上找到的第三方指令,名为。它很酷,很好看,但它可能有一个bug
首先,我将一个指令绑定到一个属性,声明我传入的元素是“DateTimePicker”。然后我将该元素传递给DateTimePicker
函数
调用此函数时,将创建一个具有绝对定位的新div,并将其附加到页面正文中
现在,我在GUI中打开一个对话框,其中有一个表。在表的每一行上,我有两个日期计时器选择器
:一个用于结束日期,一个用于开始日期
我的问题是,一旦我离开屏幕,并且DateTimePickers
绑定到的元素被销毁,DateTimePickers
仍然保留!如果我再次打开对话框,它也会创建更多的div
在我能够确定这个问题的真正解决方案之前,我决定使用元素收集器作为临时快速修复。我使用datetimepicker
类获取所有元素,并执行以下操作:
elem[i].parentNode.removeChild(elem[i]);
如果在AngularJS之前将jQuery包含在项目中,Angular将使用jQuery而不是jqLite来执行
Angular.element
函数。这意味着您应该能够使用jQuery的选择器来查找/引用DOM元素。没有确切的用例,但知道您试图在控制器中按类名聚合元素,这让我同意您的看法。将控制器视为向声明性html页面公开数据和服务的对象。数据被绑定到标记中,用于表示和可能的修改。这些服务通常包装在控制器上的函数中,这些函数随后与事件处理指令(如ng click或ng change)相关联。这些服务应该只对您的数据进行操作,并且永远不要接触DOM。如果需要修改声明性标记中的DOM元素,那么应该通过ng类等指令来完成
在任何情况下,了解你正在努力完成的任务都是很有用的,这样可以让你更好地了解解决问题的“角度方法”。好吧,我有我的答案。这并没有解决“在不接触文档元素的情况下获取具有特定类名的所有元素”的问题,但它确实解决了我的问题,并且消除了我使用
document.getElementsByClassName
的需要
首先,使用DateTimePicker指令的每个元素都有一个元素。DateTimePicker(“remove”)
函数
我对每个日期时间选择器使用一个指令:
components.directive('DateTimePicker', function() {
// Requires bootstrap-datetimestamp.js
return {
restrict: 'E',
replace: true,
scope: {
dateTimeField: '='
},
template:
'<div>' +
'<input type="text" readonly data-date-format="yyyy-mm-ddThh:ii:ssZ" data-date-time required/>'+
'</div>',
link: function(scope, element, attrs, ngModel)
{
var input = element.find('input');
input.
datetimepicker(
{
//stuff
})
.on('changeDate', function(ev)
{
//more stuff
});
...
而且它有效!DateTimePicker
被删除,DateTimePicker
的输入
句柄被清除,我已经为GC标记了我的输入
!呜呼!谢谢大家 你也可以加载jQuery吗?如果你是在一个控制器中这样做的,那么我同意你老板的意见。但是,如果您正在编写指令,并且需要访问指令DOM,那么这是一个非常有效的用例(例如elem[0].querySelector)@mccainz我在控制器内部执行此操作。你能解释一下为什么这是个坏主意吗?另外,我应该怎么做呢?请阅读AngularJS开发者指南。控制器应该只包含业务逻辑:)也不能使用JQuery,我同意这一点。我倾向于像瘟疫一样避免使用JQuery。我也不是JQuery的粉丝,但它可以实现您想要的。在适当的时候避免使用它不是很明智。我会问你的老板,他希望你如何使用just angular查询集合,因为他似乎认为这是最好的主意。谢谢mccainz,我可以很容易地将该功能放在指令中,但我自己很不高兴我首先使用元素收集器。我将编辑我的问题来解释我为什么会这样。请阅读您的更新。我认为,为了直接解决这个问题,你有提出另一个SO问题的基础。如果你能用一把小把戏或小提琴重现这个问题,那将是一个很大的帮助。如果您决定发布新问题,请更新我们。好的。谢谢mccainz,我可能会这么做的。直到那时!很不错的!感谢您在解决问题时向我们提供最新信息。
scope.$on("$destroy",function handleDestroyEvent()
{
input.datetimepicker("remove");
input = null;
});