#html #angular #date
#HTML #angular #Дата
Вопрос:
У меня есть что-то вроде приведенного ниже, и мне нужно отображать даты постепенно
<ul>
<li *ngFor="let item of items">
<h2>
{{item.name}}
</h2>
<p >
{{item.description}}
</p>
<time>{{date | date:'dd/MM/yyyy'}}</time>
</li>
</ul>
даты должны отображаться так, как для первого элемента отображается сегодняшняя дата, а затем завтрашняя и так далее.
Если есть способ, которым это можно сделать только с помощью шаблона html, тогда это лучше. Или просто помогите с лучшим способом сделать это.
Комментарии:
1. можете ли вы немного подробнее объяснить, что это отображает и что вы ожидаете от его отображения, плюс пример того, как выглядит ваш
items
массив? Кроме того, вам не нужно использовать<time>
тег при использовании канала даты. вы можете использовать div или span.2. решение не имеет ничего общего с массивом элементов, оно есть, возможно, только в том случае, если необходимо использовать индекс
3. основной вопрос касается отображения дат для первого элемента сегодняшней даты, затем для второго элемента завтрашней даты и так далее
4. понял. Я пропустил, что
date
не былоitem.date
Ответ №1:
Я не думаю, что есть способ сделать это только с помощью канала даты, его основное использование — преобразование текущей даты в другое отображение. Не добавляется / не удаляется. Что вы могли бы сделать, так это создать свой собственный канал даты с параметром смещения
Решение 1
Создание нового канала и использование библиотеки moment
import {Pipe, PipeTransform} from '@angular/core';
import * as moment from 'moment';
@Pipe({name: 'customDate'})
export class CustomDatePipe implements PipeTransform {
transform(date, format = 'dd/MM/yyyy', dayOffset = 0, monthOffset = 0, yearOffset = 0) {
return moment(new Date(date)).add(dayOffset, 'days')
.add(monthOffset, 'months')
.add(yearOffset, 'years')
.format(format);
}
}
а затем ссылайтесь на нее в html следующим образом
<ul>
<li *ngFor="let item of items; let i = index">
<span>{{date | customDate: 'dd/MM/yyyy': i}}</span>
</li>
</ul>
Решение 2
Или вы можете использовать ванильную дату javascript вместе с пользовательским каналом
import {Pipe, PipeTransform} from '@angular/core';
@Pipe({name: 'customDate'})
export class CustomDatePipe implements PipeTransform {
transform(date, format = 'dd/MM/yyyy', dayOffset = 0) {
return new Date(date).addDays(dayOffset);
}
}
и ссылайтесь на это следующим образом
<ul>
<li *ngFor="let item of items; let i = index">
<span>{{date | customDate: i | date: 'dd/MM/yyyy'}}</span>
</li>
</ul>
Комментарии:
1. Действительно ли это лучший способ, почему это лучше, чем просто вызвать функцию, которая возвращает увеличенную дату.
2. потому что эта функция будет запускаться при каждом цикле дайджеста. канал проверит, изменилось ли что-либо, и если этого не произойдет, это не вызовет никакой логики. вы можете дважды проверить это с помощью console.log() в функции, добавленной в html, по сравнению с каналом
3. @Nnnnn вот видео , объясняющее, как каналы оптимизируют программы. Я бы перешел на 25 минут.