【发布时间】:2016-09-05 21:56:18
【问题描述】:
更新:我悬赏这个问题。我不是在寻找黑客或解决方法。我正在寻找一种官方方式来访问角度组件中的 dom,并解释为什么我看到的行为($postLink 运行到早期)似乎与官方文档相矛盾。
官方文档状态 (here):
$postLink() - 在这个控制器的元素和它的子元素被链接之后调用。与 post-link 函数类似,该钩子可用于设置 DOM 事件处理程序并进行直接 DOM 操作
原问题:我这里有一个问题的例子 -> http://plnkr.co/edit/rMm9FOwImFRziNG4o0sg?p=preview
我正在使用一个角度组件,我想在post链接函数中修改dom,但是它不起作用,似乎函数运行得太早了,毕竟模板在dom中准备好之前角度处理。
在 html 页面中,我有这个:
<my-grid grid-id="'foo'"></my-grid>
组件定义为:
appModule.component('myGrid',{
controller: gridController,
bindings: {
"gridId": "<",
},
templateUrl: 'gridTemplate'
});
在组件模板中我有这个:
<table id='{{$ctrl.gridId}}'>
...
(毫无疑问,绑定本身有效。最终,在 html 中,表的 id 是预期的 '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 对象是没有用的。
【问题讨论】:
-
link timming希望对您有所帮助
标签: javascript angularjs