因此,在角度文档网站上,您可以定义Tobias和Jeff
angular.module('docsTransclusionExample', [])
.controller('Controller', ['$scope', function($scope) {
$scope.name = 'Tobias';
}])
.directive('myDialog', function() {
return {
restrict: 'E',
transclude: true,
scope: {},
templateUrl: 'my-dialog.html',
link: function (scope, element) {
scope.name = 'Jeff';
}
};
});
如果你这样做,名字是{{name}},它会说
The name is Tobias
我试图在链接功能中访问Tobias。从链接函数内部,我如何获得$ scope.name值等于Tobias?
答案 0 :(得分:10)
由于范围是隔离的scope: {},
指令,因此会创建一个新的子范围。在这种情况下,直接访问父范围属性的唯一方法是使用范围$parent
,引用父范围对象。例如:
link: function(scope, element) {
scope.name = 'Jeff';
scope.parentName = scope.$parent.name; // Tobias
}
然而,这并不理想。这就是为什么你可能想要考虑更灵活的方法:
<my-dialog name="name"></my-dialog>
并将范围配置定义为:
scope: {
parentName: '=name'
}
答案 1 :(得分:3)
您必须使用范围的$ parent属性:
scope.$parent.name = 'Jeff';
答案 2 :(得分:3)
如果您使用transclude:true
,如果您没有任何局部变量,则可以省略scope:{}
。放scope:{}
没有意义。
所以声明就像是
angular.module('docsTransclusionExample', [])
.controller('Controller', ['$scope', function($scope) {
$scope.name = 'Tobias';
}])
.directive('myDialog', function() {
return {
restrict: 'E',
transclude: true,
templateUrl: 'my-dialog.html',
link: function (scope, element) {
// scope.name = 'Jeff';
// if name is in your parent scope, you should be able to get it here
console.log(scope.name);
}
};
});
如果查看模板,您将看到ng-transclude
指令已被使用,这意味着在模板中将使用父作用域的变量。希望它有意义。
答案 3 :(得分:3)
你可以通过$ parent这样得到它:
link: function (scope, element) {
scope.name = 'Jeff';
console.log(scope.name);
console.log(scope.$parent.name);
}
答案 4 :(得分:1)
我只是想知道你为什么要这样的东西。
这样你就可以在控制器和不应该存在的指令之间创建一个依赖性。
如果您需要指令的输入数据,请明确声明。