【发布时间】:2019-03-14 15:44:44
【问题描述】:
我正在开发一个 AngularJS 项目,目的是慢慢地为 Angular 6 或我们开始升级时发布的任何版本做好准备。其中一项重要工作是将现有指令转换为组件。
我最苦恼的事情是,组件的每个实例都会在 DOM 中引入一个额外的元素,该元素包装了我的实际组件 HTML 并破坏了层次结构,这使得编写能够满足其需要的 CSS 变得非常困难到。
为了说明我的困境,想象一个名为alert 的简单组件,它为您希望用户注意的各种类型的消息提供样式。它接受两个绑定,一个message 和一个type。根据type,我们将添加一些特殊样式,并可能显示不同的图标。所有的显示逻辑都应该封装在组件中,所以使用它的人只需要确保他们正确地传递数据并且它会工作。
<alert message="someCtrl.someVal" type="someCtrl.someVal"></alert>
选项 A:将样式放在额外元素内的 <div> 上
组件模板
<div
class="alert"
ng-class="{'alert--success': alert.type === 'success', 'alert--error': alert.type === 'error'}">
<div class="alert__message">{{alert.message}}</div>
<a class="alert__close" ng-click="alert.close()">
</div>
萨斯
.alert {
& + & {
margin-top: 1rem; // this will be ignored
}
&--success {
background-color: green; // this will work
}
&--error {
background-color: red; // this will work
}
}
只要组件完全不了解它周围的一切,它就可以正常工作,但是当你想将它放在 flex-parent 中,或者使用像“+”这样的选择器时,它就会中断。
选项 B:尝试直接设置额外元素的样式
组件模板
<div class="alert__message">{{alert.message}}</div>
<a class="alert__close" ng-click="alert.close()">
萨斯
alert {
& + & {
margin-top: 1rem; // this will work now
}
.alert--success {
background-color: green; // nowhere to put this
}
.alert--error {
background-color: red; // nowhere to put this
}
}
现在我遇到了相反的问题,因为我无法为成功和错误状态附加修饰符类。
我在这里遗漏了什么吗?处理这个超出组件本身范围的附加元素的最佳方法是什么?
【问题讨论】:
-
所以问题是您的同级选择器将无法工作,因为您最终会得到像
<alert><div class='alert'></div></alert>这样的结构?或者这只是许多样式问题的一个例子? -
兄弟姐妹就是一个例子。另一个不好的问题是,如果组件是 flex-child,它将破坏 flex-tree 并根据应用的 flex 属性导致所有不同类型的布局问题。
-
会在你的组件上使用
transclude: true吗?这将使<alert></alert>元素完全替换为组件模板的内容。
标签: css angularjs components