Рассмотрим следующую директиву:
angular.module('MyApp').directive('maybeLink', function() {
return {
replace: true,
scope: {
maybeLink: '=',
maybeLinkText: '='
},
template: '<span>' +
' <span ng-hide="maybeLink" ng-bind-html="text"></span>' +
' <a ng-show="maybeLink" href="#" ng-bind-html="text"></a>' +
'</span>',
controller: function($scope) {
$scope.text = $scope.maybeLinkText.replace(/\n/g, '<br>');
}
};
});
В директиве добавляются как <span>
, так и <a>
в DOM (только один из них отображается за раз).
Как я могу переписать директиву так, чтобы она добавила либо <span>
, либо <a>
в DOM, но не оба?
UPDATE
ОК, я думаю, я мог бы использовать ng-if
следующим образом:
template: '<span>' +
' <span ng-if="!maybeLink" ng-bind-html="text"></span>' +
' <a ng-if="maybeLink" href="#" ng-bind-html="text"></a>' +
'</span>'
Но как можно избавиться от окружающего <span>
в этом случае?
ОБНОВЛЕНИЕ 2
Вот версия директивы, которая использует $compile
. Он не имеет окружения <span>
, но двухсторонняя привязка данных тоже не работает. Мне очень интересно узнать, как исправить проблему двусторонней передачи данных. Любые идеи?
angular.module('MyApp').directive('maybeLink', function($compile) {
return {
scope: {
maybeLink: '=',
maybeLinkText: '='
},
link: function(scope, element, attrs) {
scope.text = scope.maybeLinkText.replace(/\n/g, '<br>');
if (scope.maybeLink) {
element.replaceWith($compile('<a href="#" ng-bind-html="text"></a>')(scope));
} else {
element.replaceWith($compile('<span ng-bind-html="text"></span>')(scope));
}
}
};
});