我有一个奇怪的角度范围混合的情况。这是plnkr:http://plnkr.co/edit/o8cyZXkHX8Lt9Vkbn0xm
已转换的范围无法解析appCtrl.testString
,这很奇怪,因为已转换的内容应具有外部范围。更奇怪的是,num
得到了正确的解决。
此外,data-test-attr
会在ng-controller
定义的元素上获得正确的值。
这是一个最小的工作示例,因此重新排序元素或在不同位置定义范围的解决方案并不适合我。如果可能的话,我会以某种方式破解repeatedDirective
。
以下是代码:
index.html
<!DOCTYPE html>
<html ng-app="app">
<head>
<script data-require="angular.js@1.4.3" data-semver="1.4.3" src="https://code.angularjs.org/1.4.3/angular.js"></script>
<script src="script.js"></script>
</head>
<body>
<repeated-directive ng-repeat="num in [1, 2, 3, 4, 5]" ng-controller="AppController as appCtrl" data-test-attr="{{appCtrl.testString}}">
<div>{{num}} - {{appCtrl.testString}}</div>
</repeated-directive>
</body>
</html>
script.js
angular.module('app', [])
.controller('AppController', AppController)
.directive('repeatedDirective', repeatedDirective);
function AppController($scope) {
this.testString = 'Controller value';
}
function repeatedDirective() {
return {
transclude: true,
template: '<div ng-transclude></div>'
};
}
答案 0 :(得分:2)
您的控制器不在您的指令范围内:
这可以修复它,而无需更改html中的任何内容:
angular.module('app', [])
.controller('AppController', AppController)
.directive('repeatedDirective', repeatedDirective);
function AppController($scope) {
this.testString = 'Controller value';
}
function repeatedDirective() {
return {
transclude: true,
template: '<div></div>',
link: function(scope, element, attrs, ctrl, transclude) {
transclude(scope, function(clone, scope) {
element.append(clone);
});
}
};
}
http://plnkr.co/edit/LsRfyw98f4BP4G72Bgd6?p=preview
这样,您的转换不会使用单独的范围,而是占用控制器的范围。
瞧瞧有关究竟发生了什么的更多信息,我将包括一个参考博客:
http://angular-tips.com/blog/2014/03/transclusion-and-scopes/
答案 1 :(得分:0)
在ng-repeat
范围内,您的[1, 2, 3, 4, 5]
范围而不是appCtrl
,它解释了testString
的空值(实际上它是不存在的)。您应该访问$parent
以获得appCtrl
范围。
<!DOCTYPE html>
<html ng-app="app">
<head>
<script data-require="angular.js@1.4.3" data-semver="1.4.3" src="https://code.angularjs.org/1.4.3/angular.js"></script>
<script src="script.js"></script>
</head>
<body>
<repeated-directive ng-repeat="num in [1, 2, 3, 4, 5]" ng-controller="AppController as appCtrl" data-test-attr="{{appCtrl.testString}}">
<div>{{num}} - {{$parent.appCtrl.testString}}</div>
</repeated-directive>
</body>
</html>