我想弄清楚AngularJS范围如何工作。我也很好奇他们为什么以他们的方式工作。我认为以下行为没有意义(fiddle 1)。为什么没有隔离范围的指令将范围应用到它的DOM元素?
<div ng-app="app">
<p>outer element's scope: {{$id}}</p>
<custom-directive isolate-value="Hello!">
<p>inner element's scope: {{$id}}</p>
<p>isolate value: {{isolateValue || 'undefined'}}</p>
</custom-directive>
</div>
function Directive() {
return {
restrict: 'E',
scope: { isolateValue: "@" },
link: function(scope, element, attributes) {
console.log("isolate scope: " + scope.$id);
console.log("isolate value: " + scope.isolateValue);
}
};
}
angular
.module('app',[])
.directive('customDirective', Directive);
我期待打印“隔离值:你好!”的视图。但我得到“未定义”,而不是:
outer element's scope: 1
inner element's scope: 1
isolate value: undefined
的DOM元素及其内容保持在父范围(ID = 1),从而防止从视图访问正确的范围(ID = 2)。将HTML代码移动到模板中会使其正常工作(fiddle 2),但与我将该指令用作可重用组件(即相同数据,不同视图)的初始点相冲突。
我使用transclusion(fiddle 3)工作,但由于需要使用$ parent属性引用正确的作用域(transclusion会创建一个更多作用域),所以感觉有点冒险。
那么,这个指令背后隐藏着一些与DOM隔离范围不匹配的东西吗?或者DOM范围可以以某种方式调整到隔离区?
attributes.isolateValue? – YOU