У меня есть ряд строк внутри 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 динамически?
Вот как вы можете это сделать. Я предполагаю, что когда вы говорите о 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>
[class.highlight]="condition"
.
Ответ от @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>
Во время выполнения это решение будет работать немного лучше, потому что во время обнаружения изменений не будет выполняться никакой вызов функции, но только при загрузке.
Я считаю его более чистым, потому что никакая "сложная логика" не будет вызвана непосредственно шаблоном.