Как динамически выделять текст в ngFor

1

У меня есть ряд строк внутри ngFor.

<div *ngFor="let block of data;">
 <div class="class-row">
     <div class="left">A Label:</div>
     <div class="right">{{block.key1}}</div>
 </div>
<div class="class-row">
     <div class="left">Another Label:</div>
     <div class="right">{{block.key2}}</div>
 </div>
</div>

Оказывается, для некоторых строк я хотел бы выделить {{block.key1}} или {{block.key2}} на основе некоторой логики.

Есть ли способ сделать это в угловом 4+? Я думал о вызове функции компонента и {{block.key1}} ей {{block.key1}} или {{block.key2}}, что-то вроде

<div *ngFor="let block of data;">
 <div class="class-row">
     <div class="left">A Label:</div>
     <div [innerHTML]=highlight({{block.key1}}) class="right"></div>
 </div>
<div class="class-row">
     <div class="left">Another Label:</div>
     <div [innerHTML]=highlight({{block.key2}}" class="right"></div>
 </div>
</div>

но это, вероятно, невозможно. Есть ли способ изменить свойство текста в div динамически?

  • 2
    Если вы говорите о стилизации всего элемента, не обращали ли вы внимания на директиву ngClass ?
  • 1
    попробуйте использовать угловые директивы angular.io/guide/attribute-directives
Показать ещё 2 комментария
Теги:
angular
angular2-template

2 ответа

3
Лучший ответ

Вот как вы можете это сделать. Я предполагаю, что когда вы говорите о hightlight, вы имеете в виду CSS. Если вам так лучше, используйте ngClass. Вот пример того, как вы можете это сделать.

<div *ngFor="let block of data;">
  <div class="class-row">
   <div class="left">A Label:</div>
   <div [ngClass]="[shouldHighlight(block.key2) ? 'highlight' : '']" class="right">{{block.key1}}</div>
  </div>
  <div class="class-row">
   <div class="left">Another Label:</div>
   <div [ngClass]="[shouldHighlight(block.key2) ? 'highlight' : '']" class="right">{{block.key2}}</div>
  </div>
</div>

 <!--You can also do it by this way -->

   <div *ngFor="let block of data;">
  <div class="class-row">
   <div class="left">A Label:</div>
   <div [class.highlight]="shouldHighlight(block.key1)" class="right">{{block.key1}}</div>
  </div>
  <div class="class-row">
   <div class="left">Another Label:</div>
   <div [class.highlight]="shouldHighlight(block.key2)" class="right">{{block.key2}}</div>
  </div>
</div>

<style>
  .highlight{
   /* Your CSS Here*/
  }
</style>
  • 1
    Предложение: [class.highlight]="condition" .
  • 0
    Абсолютно верно. Буду обновлять
Показать ещё 6 комментариев
3

Ответ от @Ulrich верен, но я хотел бы расширить альтернативу, которую легко упустить.

То есть вы предполагаете, что вы должны вызвать функцию внутри ngFor. Ну, это правда, если вы решили не препроизводить данные.

То, что я попытаюсь сделать, это данные предварительного процесса при загрузке:

this.data.forEach(block => {
  block.highlightKey1 = this.shouldHighlight(block.key1);
  block.highlightKey2 = this.shouldHighlight(block.key2);
}

Если вы можете расширить модель, чтобы включить также дополнительные поля, все становится более плавным:

<div *ngFor="let block of data;">
  <div class="class-row">
   <div class="left">A Label:</div>
   <div [ngClass]="[block.highlightKey1 ? 'highlight' : '']" class="right">{{block.key1}}</div>
  </div>
  <div class="class-row">
   <div class="left">Another Label:</div>
   <div [ngClass]="[block.highlightKey2 ? 'highlight' : '']" class="right">{{block.key2}}</div>
  </div>
</div>

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

Я считаю его более чистым, потому что никакая "сложная логика" не будет вызвана непосредственно шаблоном.

  • 0
    Очень хороший момент. Спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню