#angular #angular6
#угловатый #угловой 6 #angular #angular6
Вопрос:
Я хотел бы динамически присваивать класс определенной ячейке в таблице.
<td *ngFor="let col of cols" [ngClass]="col.condition">
Объект в «cols» может выглядеть следующим образом:
{condition: '{'prio-high': priority == 0}', noCondition: 'prio-high'}
Я убедился, что приоритет действительно равен == 0.
Возможно ли это вообще? Следующий пример работает просто отлично. Кажется, это просто не работает, если я хочу работать с условиями.
<td *ngFor="let col of cols" [ngClass]="col.noCondition">
Пример:
.html
<style>
.condition{background-color: red}
.noCondition{background-color: blue}
.someRandomOtherCondition{background-color: orange}
</style>
<div *ngFor="let o of objects" [ngClass]="o.template">
{{ o.name }} has priority {{ o.prio }}
</div>
.тс
export class AppComponent {
info = [
{object1: 'noCondition'},
{object2: '{'condition': prio == 0}'}
]
objects = [
{
name: 'object1',
prio: 0, //imagine this number is being dynamically assigned and we don't know the value beforehand
template: 'noCondition'
},
{
name: 'object3',
prio: 0, //imagine this number is being dynamically assigned and we don't know the value beforehand
template: 'someRandomOtherCondition'
},
{
name: 'object2',
prio: 1, //imagine this number is being dynamically assigned and we don't know the value beforehand
template: '{'condition': prio == 1}'
}
];
}
если вы запустите этот пример, вы увидите, что object2 никогда не форматируется должным образом, как это должно быть.
stackblitz:https://stackblitz.com/edit/angular-dani1p
Комментарии:
1. Не могли бы вы, пожалуйста, предоставить образец StackBlitz с некоторыми примерами данных для работы с таблицей?
2. Я сделал, пожалуйста, посмотрите в основном сообщении.
Ответ №1:
Вы можете протестировать разные случаи с одной и той же переменной примерно так
компонент
state : number=0;
ngOnInit() {
setInterval( () => {
this.state = Math.floor(Math.random() * 15)
},2000)
}
шаблон
<p [ngClass] ="{red: state < 5,green : state >=5 amp;amp; state <=7 , blue : state > 7 }">
O.o => {{state}} something magical happen :)
</p>
итак, в вашем случае вы можете обновить ngClass примерно так
<ul>
<li *ngFor="let col of cols"
[ngClass]="{red:col.priority == 0,green: col.priority == 1,blue: col.priority==3}">
{{col.name}} priority => {{col.priority}}
</li>
</ul>
ОБНОВЛЕНО!💣👻
нам нужно оценить строковое условие, где условие включает свойство объекта, подобное переменной, это напоминает мне о [with][3]
инструкции, пока вы не можете использовать with
инструкцию, но я пытаюсь получить тот же результат, используя Function constructor
и object destructor
, и результат выглядит следующим образом ⬇
public getCondition(obj, condition) {
const props = Object.keys(obj).reduce( (acc, next) => `${acc} , ${next}`);
const evalCon = new Function(` return function ({${props}}) { return ${condition}} `);
return evalCon()(obj)
}
шаблон
<ul>
<li *ngFor="let obj of objects" [ngClass]="getCondition(obj,obj.template)" >
{{obj.name}}
</li>
</ul>
Комментарии:
1. спасибо, но это не совсем то, что мне нужно. В вашем примере вы знаете, что в данный момент редактируете столбец «приоритет». Что мне нужно, так это что-то вроде этого [ngClass] =»<здесь возникает случайное условие, которое может измениться на что угодно в зависимости от столбца»
2. Я также отредактирую свой основной пост, но мне нужен этот пример для работы: stackblitz.com/edit/angular-dani1p .. как вы можете видеть, object2 никогда не форматируется должным образом.
3. спасибо, единственная проблема заключается в том, что для этого всегда требуется выражение в значении шаблона: {‘blue’: true}. Можно ли этого как-то избежать?
Ответ №2:
NgClass
может использоваться с инструкцией if для динамического назначения классов.
Вот пример, если вы хотите присвоить класс, "prio-high"
когда условие col.noCondition
равно 0 :
<td *ngFor="let col of cols" [ngClass]="{'prio-hight' : col.noCondition == 0}">
Комментарии:
1. пожалуйста, взгляните на основной пост. Я внес правку. Ваше решение не будет работать в этом случае, поскольку вы ожидаете узнать, какой столбец вы редактируете.