Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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 使用AngularJS获取元素,而不引用文档_Javascript_Angularjs - Fatal编程技术网

Javascript 使用AngularJS获取元素,而不引用文档

Javascript 使用AngularJS获取元素,而不引用文档,javascript,angularjs,Javascript,Angularjs,我一直在用AngularJS开发一个高级的基于web的GUI。最近,我决定使用calldocument.getElementsByClassName()(我讨厌使用元素收集方法,但在这里我不得不使用一种方法),我的老板打开盖子访问文档元素。他说我“只需要对所有东西使用角度调用”,甚至对元素集合也是如此!是否有一种按类名收集元素的“角度方法”?如果是这样,在角度框架内使用哪种方法更好?请提供原因。谢谢 更新:为什么我需要使用元素收集器… 所以,我真的希望我不必这么做,但我确实 我使用的是我在网上找

我一直在用AngularJS开发一个高级的基于web的GUI。最近,我决定使用call
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;
});