Я знаю, что это старый вопрос, но google привел меня сюда, и мне здесь не понравились ответы ... Они казались очень сложными для чего-то, что должно быть простым. Так что я создал эту директиву:
***** ***** НОВЫЙ КОНТЕНТ
Я так сделал эту директиву более общий характер, поддерживая обработанную (типичное значение угла) «атрибуты» атрибут.
/**
* Author: Eric Ferreira <http://stackoverflow.com/users/2954747/eric-ferreira> ©2016
*
* This directive takes an attribute object or string and adds it to the element
* before compilation is done. It doesn't remove any attributes, so all
* pre-added attributes will remain.
*
* @param {Object<String, String>?} attributes - object of attributes and values
*/
.directive('attributes', function attributesDirective($compile, $parse) {
'use strict';
return {
priority: 999,
terminal: true,
restrict: 'A',
compile: function attributesCompile() {
return function attributesLink($scope, element, attributes) {
function parseAttr(key, value) {
function convertToDashes(match) {
return match[0] + '-' + match[1].toLowerCase();
}
attributes.$set(key.replace(/([a-z][A-Z])/g, convertToDashes), value !== undefined && value !== null ? value : '');
}
var passedAttributes = $parse(attributes.attributes)($scope);
if (passedAttributes !== null && passedAttributes !== undefined) {
if (typeof passedAttributes === 'object') {
for (var subkey in passedAttributes) {
parseAttr(subkey, passedAttributes[subkey]);
}
} else if (typeof passedAttributes === 'string') {
parseAttr(passedAttributes, null);
}
}
$compile(element, null, 999)($scope);
};
}
};
});
Для случая использования в ФП, вы можете сделать:
<li ng-repeat="color in colors">
<span attributes="{'class': color.name}"></span>
</li>
Или использовать его в качестве директивы атрибута:
<li ng-repeat="color in colors">
<span attributes="color.name"></span>
</li>
***** КОНЕЦ НОВОГО СОДЕРЖАНИЯ ** ****
/**
* Author: Eric Ferreira <http://stackoverflow.com/users/2954747/eric-ferreira> ©2015
*
* This directive will simply take a string directive name and do a simple compilation.
* For anything more complex, more work is needed.
*/
angular.module('attributes', [])
.directive('directive', function($compile, $interpolate) {
return {
template: '',
link: function($scope, element, attributes) {
element.append($compile('<div ' + attributes.directive + '></div>')($scope));
}
};
})
;
Для конкретного случая в этом q uestion, можно просто переписать директиву немного, чтобы сделать его применить директиву пролета по классам, а так:
angular.module('attributes', [])
.directive('directive', function($compile, $interpolate) {
return {
template: '',
link: function($scope, element, attributes) {
element.replaceWith($compile('<span class=\"' + attributes.directive + '\"></span>')($scope));
}
};
})
;
Затем вы можете использовать это в любом месте и выберите директиву по имени динамически. Используйте его так:
<li ng-repeat="color in colors">
<span directive="{{color.name}}"></span>
</li>
Я преднамеренно сохранил эту директиву простой и понятной. Вы можете (и, вероятно, будете) переписывать его в соответствии с вашими потребностями.
интересный вопрос! – TheHippo
Я не уверен, что это возможно. Однако вы можете передать color.name как параметр в одну директиву, а затем проверить значение и запустить/вызвать соответствующий код. – mikel