Вообще говоря, если вы динамически добавляете "AngularJS-ified" в документ после его создания, например, динамически создаете <button>
элементы, а затем добавляете к ним ng-click
атрибуты, эти элементы не будут отслеживаться наблюдателями, и не быть частью нормального цикла пищеварения. Так, например, рассмотрим следующий простой пример:
const myApp = angular.module('stuff', [])
.controller('stuff-cont', function($scope) {
const targ = document.querySelector('#target');
for (let i = 0; i < 10; i++) {
let newBtn = document.createElement('button');
newBtn.setAttribute('ng-click', 'sayRandNum()');
newBtn.innerText = `Button ${i}`
targ.append(newBtn);
}
$scope.sayRandNum = () =>{
alert('Your random number is '+Math.ceil(Math.random()*100));
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<div ng-app='stuff' ng-controller='stuff-cont'>
<div id='target'>
</div>
The buttons above are clickable, they have an appropriately "structured" ng-click, but they <i>don't trigger</i>!
</div>
Здесь мы (по какой-то причине...) создаем 10 почти идентичных кнопок. Однако из-за того, что когда мы создали эти ng-click
кнопки (а именно, после начальной фазы компиляции) и особенно когда мы добавили атрибуты ng-click
(также после начальной фазы компиляции), кнопки фактически не «известен» циклу AngularJS».
С другой стороны, когда AngularJS впервые «загружается» на страницу, он сначала просматривает HTML на этой странице и ищет любые привязки данных ({{likeThis}}
; мы их пока проигнорируем) или директивы. ng-click
, ng-repeat
и другие элементы Babbys First AngularJS представляют собой просто стандартизированные директивы, поэтому они являются частью этой процедуры "поиска директив". Когда AngularJS находит указанные директивы, он говорит: «Хорошо, у вас есть ng-click
для этого элемента, я буду следить за этим».
Чтобы на самом деле добавить новые элементы, ориентированные на AngularJS, или добавить поведение AngularJS к существующим элементам, что, как я полагаю, больше относится к вам, вам нужно использовать функцию $compile
, которая в основном говорит: «Эй, AngularJS! Я сделал новую вещь и хочу, чтобы вы его посмотрели!»
Этот ответ SO -- Работа с $compile в angularjs содержит довольно приличное объяснение того, как использовать функцию $compile
.
person
Newms
schedule
21.05.2019
btn.addEventListener("click",$scope.doSomething)
? - person georgeawg   schedule 21.05.2019