Этот ответ состоит из трех частей:
- Почему
DOMContentLoaded
прослушиватели событий не работают в контроллерах - Использование пользовательских директив для внедрения кода, который манипулирует DOM
- DEMO из ag-Grid с AngularJS
Почему DOMContentLoaded
прослушиватели событий не работают в контроллерах
JavaScript библиотекам, которые манипулируют DOM, необходимо координировать с DOM манипуляции, выполняемые структурой AngularJS.
AngularJS изменяет обычный поток JavaScript, предоставляя собственную обработку событий l oop. Это разбивает JavaScript на классический и AngularJS контекст выполнения. Только операции, которые применяются в контексте выполнения AngularJS, получат выгоду от AngularJS привязки данных, обработки исключений, отслеживания свойств и т. Д. c.
document.addEventListener("DOMContentLoaded"
не вызывается, когда я помещаю его в контроллер шаблонаUrl
AngularJS framework инициализирует себя после события DOMContentLoaded
. Поэтому, естественно, любой DOMContentLoaded
прослушиватель событий, добавленный впоследствии контроллером, пропустит это событие.
Следует соблюдать осторожность при смешивании AngularJS со сторонними библиотеками, которые манипулируют DOM.
Используйте пользовательские директивы для внедрения кода, который манипулирует DOM
Когда вы видите код, такой как document.querySelector("#myid')
, замените его на пользовательскую директиву:
app.directive("myDirective", function() {
return {
link: postLink
};
function postLink(scope, elem, attrs) {
//DOM initialization here
//e.g. initialize(elem);
scope.$on('$destroy', function() {
//DOM teardown code here
});
}
})
Использование: * 1040 Директивы * <div id="myid" my-directive></div>
AngularJS - это маркеры элемента DOM, которые сообщают AngularJS HTML компилятору ($ compile) присоединить указанное поведение к этому элементу DOM. Когда платформа AngularJS добавляет шаблоны в DOM, она анализирует разметку и вводит код для директив AngularJS. Когда он уничтожает DOM, он передает событие $destroy
в области, связанной с элементом. Для получения дополнительной информации см. AngularJS Разработчик Руководство - Создание пользовательских директив DEMO ag-Grid с AngularJS Когда загружается скрипт ag-Grid, он не регистрируется с AngularJS 1.x. Это связано с тем, что AngularJS 1.x является дополнительной частью ag-Grid, и вам нужно указать ag-Grid, что вы хотите его использовать: agGrid.initialiseAgGridWithAngular1(angular);
angular.module("example", ["agGrid"])
Для получения дополнительной информации см. Документация Ag-Grid - Basi c AngularJS 1.x Пример DEMO
agGrid.initialiseAgGridWithAngular1(angular);
angular.module("example", ["agGrid"])
.controller("exampleCtrl", function($scope) {
var columnDefs = [
{headerName: "Make", field: "make"},
{headerName: "Model", field: "model"},
{headerName: "Price", field: "price"}
];
var rowData = [
{make: "Toyota", model: "Celica", price: 35000},
{make: "Ford", model: "Mondeo", price: 32000},
{make: "Porsche", model: "Boxter", price: 72000}
];
$scope.gridOptions = {
columnDefs: columnDefs,
rowData: rowData
};
})
html, body {
height: 100%;
width: 100%;
margin: 0;
box-sizing: border-box;
-webkit-overflow-scrolling: touch;
}
html {
position: absolute;
top: 0;
left: 0;
padding: 0;
overflow: auto;
}
body {
padding: 1rem;
overflow: auto;
}
<script src="//unpkg.com/angular/angular.js"></script>
<script src='//unpkg.com/@ag-grid-community/all-modules/dist/ag-grid-community.min.js'>
</script>
<body ng-app="example" ng-controller="exampleCtrl" style="height: 100%">
<div ag-grid="gridOptions" class="ag-theme-balham" style="height: 100%;">
</div>
</body>