2016-03-28 3 views
70

Я получаю куски HTML-кодов из HTTP-вызовов. Я помещал блоки HTML в переменную и вставлял ее на мою страницу с помощью [innerHTML], но я не могу стилизовать вставленный блок HTML. Есть ли у кого-нибудь предложение, как я могу это достичь?Angular 2 - innerHTML styling

@Component({selector: 'calendar', 
template: '<div [innerHTML]="calendar"></div>', 
providers:[HomeService], 
styles: [` 
h3 {color:red;} 
`}) 

HTML, который я хочу создать, это блок, содержащийся в переменной «календарь».

+0

Стиль оттуда? Изнутри компонента или из стилей, добавленных в 'index.html'? –

+0

Что вы подразумеваете под 'can not style embedded HTML block'? Покажите нам, что сделали для него с небольшим фрагментом кода. – micronyks

+0

Ive обновил мое сообщение с помощью фрагмента кода! :) спасибо –

ответ

145

обновление :: нг-глубоко

/deep/ был устаревшим и заменен ::ng-deep.

::ng-deep также отмечен устаревшим, но его еще нет в наличии.

Когда ViewEncapsulation.Native должным образом поддерживается всеми браузерами и поддерживает стилизацию по границам DOM теневой границы, ::ng-deep, вероятно, будет прекращен.

оригинального

Угловые добавляют все виды классов CSS к HTML он добавляет к DOM, чтобы эмулировать тень DOM CSS инкапсуляцию, чтобы предотвратить стили кровоизлияния в и из компонентов. Angular также перезаписывает CSS, который вы добавляете, чтобы соответствовать этим добавленным классам. Для HTML, добавленного с использованием [innerHTML], эти классы не добавляются, а переписанный CSS не совпадает.

Как обходной путь попробовать

  • для CSS добавлен к компоненту
/* :host /deep/ mySelector { */ 
:host ::ng-deep mySelector { 
    background-color: blue; 
} 
  • для CSS добавлены index.html
/* body /deep/ mySelector { */ 
body ::ng-deep mySelector { 
    background-color: green; 
} 

>>> (и эквивалент /deep/ но /deep/ лучше работает с SASS) и ::shadow были добавлены в 2.0.0-beta.10. Они похожи на теневые компиляторы DOM CSS (которые устарели) и работают только с encapsulation: ViewEncapsulation.Emulated, который по умолчанию используется в Angular2. Они, вероятно, также работают с ViewEncapsulation.None, но затем игнорируются только потому, что они не нужны. Эти комбинаторы являются лишь промежуточным решением до тех пор, пока не поддерживаются более продвинутые функции для кросс-компонентного стиля.

Другой подход заключается в использовании

@Component({ 
    ... 
    encapsulation: ViewEncapsulation.None, 
}) 

для всех компонентов, которые блокируют ваш CSS (в зависимости от того, где вы добавляете CSS и где HTML является то, что вы хотите стиль - может быть все компоненты в приложение)

Update

Example Plunker

+0

Знаете ли вы, есть ли способ группировать более одного элемента css только с одним тегом host >>>? Я также пытался использовать тег: host >>> во внешнем файле css, но я не могу заставить это работать. Вы знаете, возможно ли это? –

+0

Что вы подразумеваете под «группой более одного элемента css»? Если вы добавите внешний CSS с помощью 'styleUrls: [...]' к компоненту, то он также должен работать с внешними стилями. –

+5

Просто примечание для всех, это не работает ни с узлом-сасси, ни со стилем. Только в стилях: [...] – thouliha