Обновление: Я поставил щедрость на этот вопрос. Я не ищу хаки или обходные пути. Я ищу официальный способ доступа к dom в компоненте angular и объяснение, почему поведение, которое я вижу ($ postLink работает до начала), кажется, противоречит официальным документам.
Официальные документы (здесь):
$postLink() - Вызывается после того, как этот элемент контроллера и его дочерние элементы связаны. Подобно функции post-link, этот крюк может использоваться для настройки обработчиков событий DOM и прямой манипуляции с DOM.
Оригинальный вопрос: У меня есть пример проблемы здесь → http://plnkr.co/edit/rMm9FOwImFRziNG4o0sg?p=preview
Я использую компонент angular, и я хочу изменить dom в функции post link, но он не работает, кажется, что функция запускается слишком рано, прежде чем шаблон будет фактически готов в dom после все angular обработки.
На странице html у меня есть следующее:
<my-grid grid-id="'foo'"></my-grid>
Компонент определяется как:
appModule.component('myGrid',{
controller: gridController,
bindings: {
"gridId": "<",
},
templateUrl: 'gridTemplate'
});
В шаблоне компонента у меня есть следующее:
<table id='{{$ctrl.gridId}}'>
...
(Сам связывание работает, нет сомнений. В конечном итоге в 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 выполняется, таблица находится в dom, но ее атрибут id по-прежнему {{$ctrl.gridId}}
вместо foo
, поэтому document.getElementById()
ничего не находит. Это похоже на документацию.
Что мне не хватает? Есть ли другой способ доступа к dom в компоненте?
Обновление 2: Сегодня я понял, что такая же проблема возникает с регулярной ссылкой на директивы, она не ограничивается компонентами. Поэтому, по-видимому, я неправильно понял смысл "прямое манипулирование DOM" - функция ссылки работает на элементе, который отделен от dom, поэтому использование объекта document
с селекторами бесполезно.