Как передать несколько атрибутов в директиву атрибута Angular.js?
У меня есть директива атрибута, ограниченная следующим образом:
restrict: "A"
Мне нужно передать два атрибута; число и функцию/обратный вызов, обращаясь к ним в пределах директивы, используя объект attrs
.
Если директива была директивой элемента, ограниченной с помощью "E"
, я мог бы:
<example-directive example-number="99" example-function="exampleCallback()">
Однако по причинам, в которые я не буду входить, мне нужна директива, которая будет директивой атрибута.
Как передать несколько атрибутов в директиву атрибутов?
Ответы
Ответ 1
Директива может получить доступ к любому атрибуту, который определен в одном элементе, даже если сама директива не является элементом.
Шаблон:
<div example-directive example-number="99" example-function="exampleCallback()"></div>
Директива
app.directive('exampleDirective ', function () {
return {
restrict: 'A', // 'A' is the default, so you could remove this line
scope: {
callback : '&exampleFunction',
},
link: function (scope, element, attrs) {
var num = scope.$eval(attrs.exampleNumber);
console.log('number=',num);
scope.callback(); // calls exampleCallback()
}
};
});
fiddle
Если значение атрибута example-number
будет жестко закодировано, я предлагаю использовать $eval
один раз и сохранить значение. Переменная num
будет иметь правильный тип (число).
Ответ 2
Вы делаете это точно так же, как и с директивой элемента. Вы будете иметь их в объекте attrs, мой образец будет иметь двустороннюю привязку через область изоляции, но это не требуется. Если вы используете изолированную область видимости, вы можете получить доступ к атрибутам с помощью scope.$eval(attrs.sample)
или просто scope.sample, но они не могут быть определены при привязке в зависимости от вашей ситуации.
app.directive('sample', function () {
return {
restrict: 'A',
scope: {
'sample' : '=',
'another' : '='
},
link: function (scope, element, attrs) {
console.log(attrs);
scope.$watch('sample', function (newVal) {
console.log('sample', newVal);
});
scope.$watch('another', function (newVal) {
console.log('another', newVal);
});
}
};
});
используется как:
<input type="text" ng-model="name" placeholder="Enter a name here">
<input type="text" ng-model="something" placeholder="Enter something here">
<div sample="name" another="something"></div>
Ответ 3
Вы можете передать объект как атрибут и прочитать его в директиве следующим образом:
<div my-directive="{id:123,name:'teo',salary:1000,color:red}"></div>
app.directive('myDirective', function () {
return {
link: function (scope, element, attrs) {
//convert the attributes to object and get its properties
var attributes = scope.$eval(attrs.myDirective);
console.log('id:'+attributes.id);
console.log('id:'+attributes.name);
}
};
});
Ответ 4
Это сработало для меня, и я думаю, что он совместим с HTML5. Вы должны изменить свой html для использования префикса 'data-'
<div data-example-directive data-number="99"></div>
И внутри директивы читайте значение переменной:
scope: {
number : "=",
....
},
Ответ 5
Если вы требуете "exampleDirective" из другой директивы + ваша логика находится в контроллере "exampleDirective" (скажем, "exampleCtrl" ):
app.directive('exampleDirective', function () {
return {
restrict: 'A',
scope: false,
bindToController: {
myCallback: '&exampleFunction'
},
controller: 'exampleCtrl',
controllerAs: 'vm'
};
});
app.controller('exampleCtrl', function () {
var vm = this;
vm.myCallback();
});