別の (しかし関連する) DOM 要素をクエリしようとしている、かなり単純なディレクティブがあります。
関連するマークアップ:
<a href="#target-id" data-collapsible="isCollapsed">Open</a>
...
<div id="target-id">...</div>
コントローラ:
app.controller('MyController', ['$scope', function( $scope ) {
$scope.isCollapsed = true;
}]);
指令:
app.directive('collapsible', function() {
return {
restrict: 'A',
link: function( scope, el, attrs ) {
var target = attrs.href.slice(1); // "target-id"
console.log(document.getElementById(target)); // this will be null
}
};
});
問題は、DOM クエリ ( document.getElementById(target)
) が使用可能になる前に実行されて<div id="target-id">...</div>
いることです。これまでのところ、競合状態を回避するには、クエリを$timeout
100 ~ 500 ミリ秒の遅延でラップすることしかできませんでしたが、これは間違っているように感じます。
確かに私は何か間違ったことをしている、および/またはこれについてもっと良い方法があるはずですか?
This SO threadは同様の問題の概要を説明していますが、ゼロ遅延タイムアウトは機能しません。