Хорошо, поэтому у меня есть директива, которая берет атрибуты и читает ее (и записывает ее).
Вот плункер: http://embed.plnkr.co/IkKPLahPc9yqeHWEQUG3/
Я думаю, это из-за контроллера: ctrl внутри main-directive.js, у которого ничего нет, тогда как фактическое действие происходит внутри изолированного контроллера контроллера директивы.
Вот основная директива.js:
var app = angular.module('testapp.directive.main', ['main']);
app.directive('myCustomer', function() {
var controller = ['$scope', function($scope) {
$scope.dan = { 'name': 'Dan', 'nationality': 'ESP' };
// scope from here obv...
}];
var template = 'Getting attribute value of =getInfo... {{getInfo.name}} from {{getInfo.nationality}}';
return {
restrict: 'E',
controller: controller,
scope: {
getInfo: "=info"
},
template: template
};
});
app.controller('ctrl', function($scope) {
})
и вот мой шаблон:
<div ng-controller="ctrl">
<my-customer info="dan">
</my-customer>
</div>
Почему моя директива не читает атрибут информации?
Вы правы, объект $ scope.dan должен находиться в области "ctrl controller" и вытащить из области действия контроллера директив.
app.controller('ctrl', function($scope) {
$scope.dan = { 'name': 'Dan', 'nationality': 'ESP' };
})
Это применимо к методу двусторонней привязки данных, который вы настроили для getInfo, используемого "= info",
То, как это кодируется, ожидает, что контроллер ctrl получит свойство "dan" в своей области. Если вы просто передаете строку "дан", вы хотите изменить свою директиву на использование @вместо =
app.directive('myCustomer', function () {
var controller = ['$scope', function ($scope) {
$scope.dan = {'name': 'Dan', 'nationality': 'ESP'};
// scope from here obv...
}];
var template = 'Getting attribute value of =getInfo... {{getInfo.name}} from {{getInfo.nationality}}';
return {
restrict: 'E',
controller: controller,
scope: {
getInfo: "@info" //<--NOTE THE CHANGE HERE
},
template: template
};
});