Обновление: Я поставил щедрость на этот вопрос. Я не ищу хаки или обходные пути. Я ищу официальный способ доступа к dom в угловом компоненте и объяснение, почему поведение, которое я вижу ($ postLink работает до начала), кажется, противоречит официальным документам.
Официальный документы государственного (here):
$ postLink() - Вызывается после того, как элемент этого контроллера и его детей были связаны между собой. Аналогично функции пост-связи этот крюк может быть использован для создания обработчиков событий DOM и делать прямые манипуляции DOM
Оригинальный вопрос: У меня есть пример задачи здесь ->http://plnkr.co/edit/rMm9FOwImFRziNG4o0sg?p=preview
I я использую угловой компонент, и я хочу изменить dom в функции post link, но он не работает, кажется, что функция запускается слишком рано, прежде чем шаблон будет фактически готов в dom после всей угловой обработки.
На странице HTML, у меня есть это:
<my-grid grid-id="'foo'"></my-grid>
компонент определяется как:
appModule.component('myGrid',{
controller: gridController,
bindings: {
"gridId": "<",
},
templateUrl: 'gridTemplate'
});
В компоненте шаблона у меня есть это:
<table id='{{$ctrl.gridId}}'>
...
(The Несомненно, сам связывание. Несомненно, в html идентификатор таблицы «foo», как и ожидалось).
В контроллере, у меня есть что-то вроде этого:
function gridController($scope, $compile, $attrs) {
console.log ("grid id is: " + this.gridId); // 'foo'
this.$postLink = function() {
var elem = document.getElementById(this.gridId);
// do something with elem, but elem is null
}
}
То, что я вижу при отладке, что когда функция $ postLink выполняется, таблица в йот, но его атрибут ID еще {{$ctrl.gridId}}
вместо foo
, поэтому document.getElementById()
ничего не находит. Это похоже на документацию.
Что мне не хватает? Есть ли другой способ доступа к dom в компоненте?
Обновление 2: Сегодня я понял, что такая же проблема возникает с регулярной ссылкой на директивы, она не ограничивается компонентами. Поэтому, по-видимому, я неправильно понял смысл «прямое манипулирование DOM» - функция ссылки работает на элементе, который отделен от dom, поэтому использование объекта document
с селекторами бесполезно.
[ссылка тайминги] (http://www.bennadel.com/blog/2603-directive-controller-and-link-timing-in-angularjs.htm) надеюсь, что это поможет –