Я использую CSS в стиле БЭМ для стилизации своих угловых директив и обычно использую replace: true, чтобы мой класс уровня блока мог находиться в «корне» пользовательского элемента. Это делает так, что я могу писать весь свой CSS в основном с помощью классов.
Однако replace: true иногда вызывает проблемы (с двумя ng-if и т. д.) и теперь помечен как устаревший. Так что я начинаю пытаться держаться подальше от замены полностью.
Но теперь у меня возникли проблемы с применением БЭМ к этим элементам, которые имеют фактический пользовательский тег DOM — теперь мне приходится использовать имя тега вместо имени класса, что означает, что я больше не могу использовать БЭМ (поскольку я мне придется использовать имя тега, так как я не могу применять классы непосредственно к моему элементу в моем шаблоне). Кроме того, использование модификаторов для моего пользовательского элемента теперь кажется невозможным, как и использование одноуровневых селекторов CSS.
Вот пример, который, надеюсь, проиллюстрирует то, что я имею в виду:
Директива:
angular.module('my.module')
.directive('customElement', function() {
return {
restrict: 'E',
scope: {
isSpecial: '='
},
template: '<div class="custom-element" ng-class="{\'custom-element--special\': isSpecial"></div>'
};
});
CSS:
.custom-element {
background-color: white;
}
.custom-element--special {
background-color: red;
}
.custom-element--special + .custom-element--special { // this won't work without replace: true
background-color: blue;
}
Если я использую replace: true, все работает, как и ожидалось (но тогда возникают собственные головные боли).
Если я не использую замену, классы не применяются к корневому пользовательскому элементу, поэтому дочерний селектор не работает.
Я всегда мог бы добавить классы к элементу в функции postLink, но это делает шаблон менее понятным.
Есть ли у кого-нибудь опыт использования БЭМ с angular и использования классов вместо имен тегов в ваших пользовательских директивах? Что вы сделали, чтобы решить эту проблему?