我需要从我的链接函数中操作 DOM。
我注意到,当我将替换设置为 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?我在文档中没有发现任何内容表明这两种情况之间应该存在差异。
从有关链接功能的文档中,听起来 DOM 在链接过程之后可用:(http://docs.angularjs.org/guide/directive)
链接后功能 在子元素链接后执行。在 post-linking 函数中进行 DOM 转换是安全的。
请注意,在我的 scope.$watch 中,我实际上是在调用一个期望 DOM 存在的 jQuery 插件,而不是通过 $() 直接访问元素