Angular 2 nth-of-type

237
12 февраля 2017, 11:55

Добрый день! Разбираясь в Angular 2 потребовалось вывести список элементов на экран пользователя.

<campaigns>
    <campaign *ngFor="let campaign of campaigns"></campaign>
</campaigns>

И надо чтобы каждый не четный элемент изменял свой цвет с белого на серый.
Раньше при простой верстке я использовал псевдокласс :nth-of-type(odd). Который сам делал каждый нечетный элемент нужно мне цвета(например). Но для компонентов это почему то не работает.
Я могу конечно сделать:

<campaigns>
   <campaign *ngFor="let campaign of campaigns; let i = index" [background]="i % 2 == 0 'green':'white'"></campaign>
</campaigns>

Но мне кажется что этот подход костыльный.
В связи с чем вопрос как передать внутрь компонента информацию из css родительского контейнера.

Код css campaigns

campaign:nth-of-type(odd) {
   background: #f2f2f2;
}

Код сss и html campaign

<div class="campaign">
<div class="inlineBlock videoContainer">
    <video width="100%" controls="controls" preload="metadata">
        <source src="http://a-media.pro/videos/1479360662.mp4">
    </video>
</div>
<div class="inlineBlock leftContainer">
    <a class="campaignName text-top" [routerLink]="['/campaigns', campaign.id]">{{campaign.name}}</a><br/>
    Показов по плану - {{campaign.countShow}}<br/>
    Комплексов - {{campaign.countDevice}}
    <div class="bottom">Тип проката <span class="text-bottom">«{{campaign.methodName}}»</span></div>
</div>
<img src="/images/line.png" class="inlineBlock" style="margin-top: 8px">
<div class="inlineBlock rightContainer">
    <div class="text-top">
        {{campaign.budget}} р.
    </div>
    c {{campaign.start | date: 'dd.M.y' }}<br/>
    до {{campaign.end | date: 'dd.M.y' }}
    <div class="bottom right"><span class="text-bottom">{{campaign.statusName}}</span></div>
</div>

.campaign {
  width: 100%;
  height: 190px;
  padding: 17px 0;
  color: #000000;
  font-size: 16px;
  font-family: "Segoe UI", sans-serif;
  -webkit-box-sizing: border-box;
  /* Safari/Chrome, other WebKit */
  -moz-box-sizing: border-box;
  /* Firefox, other Gecko */
  box-sizing: border-box;
  /* Opera/IE 8+ */
}
Answer 1

Разобрался как это делается. Надо было просто использовать /deep/(>>> тоже самое)

campaign:nth-of-type(odd) >>> .campaign {
   background: #f2f2f2;
}

Как пишет Grundy и на просторах интернета /deep/ и >>> являются устаревшими и не должны работать(хотя у меня они работают). Нашел в документации Angular 2 про view-encapsulation: https://angular.io/docs/ts/latest/guide/component-styles.html#!#view-encapsulation И у компонента campaigns выставил encapsulation: ViewEncapsulation.None и сделал такой css

campaign:nth-of-type(odd) .campaign {
   background: #f2f2f2;
}

Получился тот же результат.

READ ALSO
Перечислите члены класса

Перечислите члены класса

Почему определение "Класс состоит из полей и методов" не является полным? Что еще может быть составной частью класса?

273
Предварительные объявления классов

Предварительные объявления классов

Зачем нужно предварительные объявления классов в заголовочном файле?

244
Ошибка в реализации сортировки

Ошибка в реализации сортировки

Если я правильно понял проблему, то она заключается в том, что я не ставлю некоторые числа на правильное местоНо я не знаю, как исправить эту...

357
Библиотека для работы с русским языком c++?

Библиотека для работы с русским языком c++?

Есть массив русских буквНужно работать с элементами этого массива, также как и с обычными английскими буквами

304