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.