Javascript Angularjs在新Dom上检测指令

Javascript Angularjs在新Dom上检测指令,javascript,jquery,angularjs,dom,angularjs-directive,Javascript,Jquery,Angularjs,Dom,Angularjs Directive,嗨,我一直在开发angular应用程序。我怀疑angularjs是否在添加新DOM时检测到指令 让我们假设在这个场景中,我有一个名为title的Angular指令,当Dom有一个名为title的类时,它会编译 使用类Hellomentation添加新Dom时。angular指令是否检测此DOM 如果没有,那么如何在这个新DOM上绑定事件。考虑下面的场景。 变量应用=角度。模块“应用” 应用程序控制器'Home',函数$scope,$timeout{ $timeout函数{ $.main.app

嗨,我一直在开发angular应用程序。我怀疑angularjs是否在添加新DOM时检测到指令

让我们假设在这个场景中,我有一个名为title的Angular指令,当Dom有一个名为title的类时,它会编译

使用类Hellomentation添加新Dom时。angular指令是否检测此DOM

如果没有,那么如何在这个新DOM上绑定事件。考虑下面的场景。

变量应用=角度。模块“应用” 应用程序控制器'Home',函数$scope,$timeout{ $timeout函数{ $.main.append; }, 5000; 应用程序指令“提及”,功能{ 返回{ 限制:“AEC”, 是的, 链接:功能范围、要素、附件B{ }, 模板:“在提及时” } }; 回答:是的。在每个$digest循环中,Angular都会在DOM元素上循环,所以如果将创建一个附加了指令的新节点,那么Angular确实会看到并初始化该指令

修改您的代码这一切似乎都与$有关,它超出了角度范围。您是否尝试过像这样用$apply包装您的append


Angular不知道添加了新DOM,也不调用这些DOM元素上的指令。为了使Angular熟悉新DOM,您应该将其编译为新模板。下面是您的代码的外观:

JavaScript

普朗克

您可以像往常一样将事件绑定到新DOM:

$(".main").append(
    $compile("<a class='mention'>some text</a>")($scope)
).on('click', function() {
    $window.alert('click')
});
除此之外,您提供的代码中还存在多个问题:

var-app=angular.module'app'应该是var-app=angular.module'app',[]以声明新模块而不是获取它; 在使用jQuery添加新DOM的行中添加了额外的右括号 您应该在控制器代码之外定义新指令 模板中应包含带有transclude:true的指令 注


直接在Angular中操作DOM是一种不好的做法。只在指令的链接或编译函数中操作,或者在您没有其他选择的情况下操作。例如,无法修改的第三方代码应该与Angular集成。

但是我的指令函数不起作用。它没有绑定到新的DOM。您是否告诉Angular您的指令是class.您也应该发布指令代码,这样我们就可以看一看了。请检查上面的场景。现在它是使用$timeout添加的,它具有角度作用域。@Danmordan不幸的是,您在这两个方面都错了:angular不会每$digest循环一次就循环DOM元素,它会遍历$scope树来检测更改。angular运行每次执行$timeout后,$digest循环,因此将$timeout内运行的代码包装到$scope中。$apply无效。是的,angular使用$digest循环查看新的DOM节点
angular.module('app', []).
  controller('ctrl', function($scope, $timeout, $compile) {
    $timeout(function() {
      $(".main").append(
        $compile("<a class='mention'>some text</a>")($scope)
      );
    }, 500);
  }).
  directive('mention', function() {
    return {
      restrict: 'AEC',
      transclude: true,
      link: function (scope, element, attb) {

      },
      template: '<h1> AT mentions <ng-transclude></ng-transclude></h1>'
    }
  });
$(".main").append(
    $compile("<a class='mention'>some text</a>")($scope)
).on('click', function() {
    $window.alert('click')
});