リンク関数内から DOM を操作する必要があります。
replace を false に設定すると、DOM にアクセスできることに気付きました ( http://jsfiddle.net/bcsU8/ )
//body of directive
return {
restrict: 'A',
replace: false,
scope: {
bar: '@myDir'
},
template: '<div id="{{bar}}">foo bar is <span>{{bar}}</span></div>',
link: function(scope, element, attr) {
scope.$watch('myDir', function(value) {
console.log('In watch - scope.bar: ', scope.bar);
console.log('DOM accesible? ', $("#"+scope.bar).length == 1);
});
}
};
しかし、それをtrueに設定するとできません( http://jsfiddle.net/PpXgb/ )
return {
restrict: 'A',
replace: true,
scope: {
bar: '@myDir'
},
template: '<div id="{{bar}}">foo bar is <span>{{bar}}</span></div>',
link: function(scope, element, attr) {
scope.$watch('myDir', function(value) {
console.log('In watch - scope.bar: ', scope.bar);
console.log('DOM accesible? ', $("#"+scope.bar).length == 1);
});
}
};
置換がオンのときに DOM にアクセスできないのはなぜですか? これら2つのケースに違いがあるべきであることを示すドキュメントは見つかりませんでした。
リンク機能に関するドキュメントから、リンク プロセス後に DOM が使用可能になるようです: ( http://docs.angularjs.org/guide/directive )
リンク後関数 子要素がリンクされた後に実行されます。ポストリンク関数でDOM変換を行うのは安全です。
私の scope.$watch では、$() を介して要素に直接アクセスするのではなく、DOM が存在することを期待する jQuery プラグインを実際に呼び出していることに注意してください。