如何设置这样的范围值:
<div ng-controller="MyCtrl">
<my-element ng-repeat="p in people" person='p'></my-element>
</div>
var myApp = angular.module('myApp',[]);
myApp.directive('myElement', function(){
return {
restrict: 'E',
template: '<div>{{ name }}</div> <div>{{ age }}</div>'
}
});
function MyCtrl($scope) {
$scope.people = [{ name: 'Mike', age: 20 },{name: 'Peter', age: 22 }];
}
答案 0 :(得分:25)
如果通过“设置范围值”表示模板有效,那么
template: '<div>{{ p.name }}</div> <div>{{ p.age }}</div>'
由于ng-repeat的每次迭代都会创建一个新的子范围,因此在该范围内定义了p
。由于您的指令未创建隔离范围,因此您不需要属性person
,因此这适用于上述内容:
<my-element ng-repeat="p in people"></my-element>
如果您需要隔离范围,请使用
<my-element ng-repeat="p in people" person='p'></my-element>
和
return {
restrict: 'E',
scope: {
person: '='
},
template: '<div>{{ person.name }}</div> <div>{{ person.age }}</div>'
}
答案 1 :(得分:3)
您无需在指令中创建隔离范围。 ng repeat将自动为您执行此操作。 所以只需删除:
指令中的:
scope: {
person: '='
},
并在ng repeat html标记中:
person='p'
在你的指令中,您将能够访问类似的内容
$scope.p.personAttribute
如下所述: angularjs-pass-instance-of-each-ng-repeat-in-html-to-directive
答案 2 :(得分:2)
我喜欢在定义指令范围时使用'@'。这使得指令隔离范围能够访问p,例如在链接:
中return {
scope: '@',
link: function(scope) {
console.log(scope.p); //It can now be accessed because of '@'
}
}