Как передать значение в директиву Angular через атрибут class?
Я написал следующую директиву, которая создает twitter-карту, когда вы передаете идентификатор твита.
angular.module('app')
.directive('tweetCard',function () {
return {
transclude:true,
template: '<ng-transclude></ng-transclude>',
restrict: 'AEC',
controller:function($scope, $element, $attrs){
twttr.widgets.createTweet($attrs.tweetId,$element[0],
{theme:$attrs.theme?$attrs.theme:'light'})
.then(function(){
$element.find('ng-transclude').remove();
});
}
};
});
Эта директива отлично работает, если я использую ее как ниже.
<tweet-card tweet-id="639487026052644867"></tweet-card>
<div tweet-card tweet-id="639487026052644867"></div>
Хотя, причина, по которой я создал эту директиву, заключается в том, что я мог бы поместить этот тег в свой wordpress.com блог. После того, как я попробовал его, кажется, wordpress не позволяет неизвестные теги, которые я ожидал. Но они также не допускают неизвестных атрибутов или атрибутов данных в посте. Так что я постарался выложить все в классе атрибут, как вы видите ниже.
<div class="tweet-card tweet-id:639526277649534976;"></div>
К сожалению, это не работает, и я попробовал поиграть с ним.
Я могу расширить директиву, чтобы также проверить, содержит ли атрибут tweetCard такой идентификатор.
angular.module('app')
.directive('tweetCard',function () {
return {
transclude:true,
template: '<ng-transclude></ng-transclude>',
restrict: 'AEC',
controller:function($scope, $element, $attrs){
var id = $attrs.tweetId?$attrs.tweetId:$attrs.tweetCard;
twttr.widgets.createTweet(id,$element[0],
{theme:$attrs.theme?$attrs.theme:'light'})
.then(function(){
$element.find('ng-transclude').remove();
});
}
};
});
Со следующим html-кодом.
<div class="tweet-card:639526277649534976;"></div>
Хотя мне не нравится этот обходной путь,и я не могу передать другой атрибут, такой как атрибут темы. Кто-нибудь знает, как передать несколько переменных через атрибут класса в директиву?
1 ответ:
Я посмотрел на AngularJS docs, чтобы найти способ использовать несколько переменных через класс, но ничего не нашел, поэтому я написал функцию для преобразования имени класса в синтаксисе angular reads. (
<span class="my-dir: exp;"></span>
) к объекту.function classNameToObj(className) { //different attributes are separated by semicolons var attributes = className.split(';'); var obj = {}; for (var i = 0; i < attributes.length; i++) { var attribute = attributes[i]; //key-values separated by colon var splittedAttr = attribute.split(':'); obj[splittedAttr[0].trim()] = splittedAttr[1].trim(); } return obj; }
Таким образом, ваш HTML может передавать как идентификатор твита, так и ТЕМУ:
<div class="tweet-card:639526277649534976; theme:dark"></div>
И ваша директива может создать виджет следующим образом:
var id = $attrs.tweetCard; var attributes = classNameToObj($attrs.class); var theme = attributes.theme; twttr.widgets.createTweet(id, $element[0], { theme: theme || 'light' }) .then(function() { $element.find('ng-transclude').remove(); });
Здесь работает plunkr