Ich erhalte Teile von HTML-Codes von HTTP-Aufrufen. Ich habe die HTML-Blöcke in eine Variable eingefügt und sie mit [innerHTML] auf meiner Seite eingefügt, aber ich kann den eingefügten HTML-Block nicht formatieren. Hat jemand einen Vorschlag, wie ich das erreichen könnte?
@Component({selector: 'calendar',
template: '<div [innerHTML]="calendar"></div>',
providers:[HomeService],
styles: [`
h3 {color:red;}
`})
Der HTML-Code, den ich formatieren möchte, ist der Block, der in der Variablen "Kalender" enthalten ist.
index.html
?can not style the inserted HTML block
? Zeigen Sie uns mit einem kleinen Codeausschnitt, was Sie dafür getan haben.Antworten:
Update 2
::slotted
::slotted
wird jetzt von allen neuen Browsern unterstützt und kann mit verwendet werdenViewEncapsulation.ShadowDom
https://developer.mozilla.org/en-US/docs/Web/CSS/::slotted
Update 1 :: ng-deep
/deep/
wurde veraltet und ersetzt durch::ng-deep
.::ng-deep
ist ebenfalls bereits als veraltet markiert, es ist jedoch noch kein Ersatz verfügbar.Wenn
ViewEncapsulation.Native
dies von allen Browsern ordnungsgemäß unterstützt wird und das Styling über Schatten-DOM-Grenzen hinweg unterstützt::ng-deep
wird , wird dies wahrscheinlich eingestellt.Original
Angular fügt dem HTML-Code, den es dem DOM hinzufügt, alle Arten von CSS-Klassen hinzu, um die Schatten-DOM-CSS-Kapselung zu emulieren und das Ausbluten von Komponenten zu verhindern. Angular schreibt auch das hinzugefügte CSS neu, um es diesen hinzugefügten Klassen anzupassen. Für HTML, das mit
[innerHTML]
diesen Klassen hinzugefügt wurde, werden keine hinzugefügt und das neu geschriebene CSS stimmt nicht überein.Versuchen Sie es als Problemumgehung
index.html
>>>
(und das Äquivalent/deep/
,/deep/
funktioniert aber besser mit SASS) und::shadow
wurden in 2.0.0-beta.10 hinzugefügt. Sie ähneln den Schatten-DOM-CSS-Kombinatoren (die veraltet sind) und funktionieren nur mitencapsulation: ViewEncapsulation.Emulated
den Standardeinstellungen in Angular2. Sie arbeiten wahrscheinlich auch mitViewEncapsulation.None
, werden dann aber nur ignoriert, weil sie nicht notwendig sind. Diese Kombinatoren sind nur eine Zwischenlösung, bis erweiterte Funktionen für das komponentenübergreifende Styling unterstützt werden.Ein anderer Ansatz ist zu verwenden
für alle Komponenten, die Ihr CSS blockieren (hängt davon ab, wo Sie das CSS hinzufügen und wo sich der HTML-Code befindet, den Sie formatieren möchten - möglicherweise alle Komponenten in Ihrer Anwendung)
Aktualisieren
Beispiel Plunker
quelle
/deep/
anstelle von>>>
inneeHTML
Die einfache Lösung, der Sie folgen müssen, ist
quelle
Wenn Sie versuchen, dynamisch hinzugefügte HTML-Elemente innerhalb einer Angular-Komponente zu formatieren, kann dies hilfreich sein:
Ich vermute, dass die Konvention für dieses Attribut zwischen Angular-Versionen nicht garantiert stabil ist, so dass beim Upgrade auf eine neue Version von Angular Probleme mit dieser Lösung auftreten können (obwohl das Aktualisieren dieser Lösung wahrscheinlich trivial wäre Fall).
quelle
Wir ziehen häufig Inhalte aus unserem CMS als
[innerHTML]="content.title"
. Wir platzieren die erforderlichen Klassen in derstyles.scss
Stammdatei der Anwendung und nicht in der scss-Datei der Komponente. Unser CMS entfernt absichtlich Inline-Stile, sodass wir Klassen vorbereitet haben müssen, die der Autor in ihren Inhalten verwenden kann. Denken Sie daran, dass die Verwendung{{content.title}}
in der Vorlage kein HTML aus dem Inhalt rendert.quelle
Wenn Sie sass als Stilpräprozessor verwenden, können Sie für die Dev-Abhängigkeit wieder zum nativen Sass-Compiler wechseln, indem Sie:
npm install node-sass --save-dev
Damit Sie / deep / weiterhin für die Entwicklung verwenden können.
quelle