Digamos que hay un marco simple para mostrar ventanas emergentes:
@Component(
selector: 'popup-host',
template: '''
<div class="popup-container">
<ng-template #popupRef></ng-template>
</div>
''',
styles: ['.popup-container { position: absolute; top: 100; left: 100; z-index: 100; }'],
)
class PopupContainerComponent {
final PopupController _controller;
final ComponentLoader _loader;
PopupContainerComponent(this._controller, this._loader);
void ngOnInit() {
_controller.container = this;
}
@ViewChild('popupRef', read: ComponentRef)
ComponentRef popupRef;
void render(PopupConfig config) {
final componentRef = _loader.loadNextTo(config.factory, popupRef);
if (componentRef.instance is HasValueSetter) {
componentRef.instance.value = config.value;
}
}
}
@Injectable()
class PopupController {
PopupContainerComponent _container;
set container(PopupContainerComponent container) => _container = container;
void showPopup(PopupConfig config) {
container.render(config);
}
...
}
class PopupConfig {
final ComponentFactory factory;
final dynamic value;
PopupConfig(this.factory, [this.value]);
}
abstract class HasValueSetter {
set value(dynamic value);
}
Esto se puede usar así:
// Somewhere in the root template
<popup-host></popup-host>
// In popup.dart
@Component(
selector: 'happy-popup',
template: '''
<div class="header">This is the popup content.</div>
<div class="main">The value is {{value}}.</div>
<div class="footer">I am happy!</div>
''',
)
class HappyPopupComponent implements HasValueSetter {
@override
dynamic value;
}
// In some_other.dart
@Component(
...
styles: [
'.header { font-weight: bold }',
'.main { color: red }',
'.footer { color: green; font-style: italic }',
],
...
)
class SomeOtherComponent {
final PopupController _popupController;
...
SomeOtherComponent(this._popupController, ...) ...;
void displayPopup() {
_popupController.showPopup(HappyPopupComponentNgFactory, 42);
}
}
...
¿Hay alguna forma de reenviar estilos desde <some-other-component>
hasta <happy-popup>
sin tener que definirlos en la raíz de la aplicación?
fuente
PopupConfig
. ¿Es posible personalizar lastyleUrls
propiedad en un componente en tiempo de ejecución?styleUrls
dinámicamente en el tiempo de ejecución. Hay múltiples formas de hacerlo. Le sugiero que busque paraAngular dynamic styleUrls
obtener algunas ideas y ver cuál le queda mejor. En cuanto a la segunda pregunta. Si ese es el caso, importaría el archivo de estilo emergente compartido + el archivo de estilo donde sobrescribo los estilos que quiero cambiar para un componente específico.styleUrls
en tiempo de ejecución, ¿no? ¿Qué sucede si aparecen dos ventanas emergentes al mismo tiempo, por ejemplo, una abre otra y necesitan un estilo diferente? Si modifico elstyleUrls
, ¿no sería el estilo de ambos? Finalmente, no pude encontrar un buen artículo sobre cómo modificar dinámicamentestyleUrls
sin hacks. Parece que Angular no lo admite de forma nativa.Como su ventana emergente no es un elemento secundario del componente que lo abrió, no puede usar :: ng-deep
lo único que creo que funcionará es eliminar la encapsulación de vista del host, la ventana emergente y el componente que abre la ventana emergente (pruebe solo la ventana emergente y el componente que abre la ventana emergente primero, si eso no funciona, elimine la encapsulación del host también.)
fuente
header
,main
yfooter
uno puede diseñar fácilmente dichos componentes de manera incidental. Quizás uno pueda intentar usar nombres más específicos para evitar conflictos, pero preferiría una solución que mantenga la encapsulación.ViewEncapsulation
es un gran no-no para aplicaciones de tamaño medio o grande. Tiene especial cuidado o todo su estilo se verá afectado a largo plazo. (Ej: nombres de clase genéricos). Y no estoy de acuerdo con que sea la única solución a sus requisitos.Puedes combinar scss con tu código
Primero debe separar el archivo scss que desea compartir en la aplicación
Por ejemplo:
En style1.scss
Luego en style2.scss
O puede combinar la lista de archivos scss en su código de componente definiendo en la lista de matriz
Así es como puede configurar manualmente el soporte de scss para angular cli
En angular.json agregar
fuente
@import
declaraciones. Pero al igual que la respuesta de @Dino, me pregunto si es posible no tener que codificar la URL del estilo en el componente emergente, sino leerlo desde elPopupConfig
y, de alguna manera, asignarlo en tiempo de ejecución.Puede enviar el valor de prop al componente, que puede ser una clase personalizada y ponerlo en su popop html. Y luego, en el archivo scss, agregue anulaciones css adicionales para una clase específica. Entonces, para cada componente personalizado, puede tener un código CSS personalizado.
PD: Y sí, sugeriría importar un archivo scss como:
Es mejor separar css de js + su código css, entonces puede ser mucho más largo y contener todos los casos de estilo.
fuente
Además de los métodos ya mencionados, sugeriría dos vías más para explorar:
desde el ámbito angular de CSS a los componentes y nos gustaría mantenerlo de esta manera, el límite del componente de cruce se puede hacer descubriendo qué alcance Angular le asignó y agregando CSS de ámbito manual en global
<style>
etiqueta en la página:@ViewChild ('popupRef') popupRef; ngAfterViewInit () {this.popupRef.nativeElement.attributes [0] .name // esto tendrá un valor similar al
_ngcontent-tro-c1
que necesitarás para abarcar todo tu CSS personalizado. }Un inconveniente aparente de este enfoque es que Angular oculta la administración de CSS y, por lo tanto, tendrá que recurrir a JS para administrarlo. ( un ejemplo aquí )
Personalmente, exploraría la segunda opción, ya que parece ser menos hacky
fuente