#javascript #angular #counting
#javascript #angular #подсчет
Вопрос:
Объект имеет 3 свойства:
public obj;
…
this.obj = {
height: 10,
width: 20,
weight: 30
};
Затем я связываю кнопки с этими свойствами, но я хочу нумеровать кнопки и показывать их только в том случае, если значение свойства существует:
<button *ngIf="obj.height"> Button <span class="buttonNr">1</span> </button>
<button *ngIf="obj.width"> Button <span class="buttonNr">2</span> </button>
<button *ngIf="obj.weight"> Button <span class="buttonNr">3</span> </button>
Однако, если, допустим, ширина отсутствует, я бы получил «Кнопку 1» и «Кнопку 3»
, и я хочу, чтобы они были пронумерованы нормально, независимо от того, какие свойства существуют или нет, я хочу иметь кнопку 1, затем 2, затем 3…
В случае, если ширина не существует, я хочу иметь кнопку 1 для высоты и кнопку 2 для веса.
Теперь я знаю, как это сделать с помощью jQuery, для итерации и заполнения промежутков с помощью класса buttonNr, считая от 1 до конца. Но я бы хотел сделать это угловым способом, без jQuery.
РЕДАКТИРОВАТЬ: Извините, когда я увидел первый ответ, я понял, что слишком упростил свой пример: существуют различные объекты. Итак, представьте, что также
public data;
public book;
...
this.data = {
color: 'blue',
price: 100
}
this.book = {
title: 'a',
author: 'b'
}
и затем я просто продолжаю добавлять кнопки, но также зависит их отображение.
<button *ngIf="data.color"> Button <span class="buttonNr">4</span> </button>
<button *ngIf="data.price"> Button <span class="buttonNr">5</span> </button>
<button *ngIf="book.title"> Button <span class="buttonNr">6</span> </button>
<button *ngIf="book.author"> Button <span class="buttonNr">7</span> </button>
Ответ №1:
Если вы хотите четко указать порядок кнопок, вы можете определить getButtons()
метод в компоненте:
getButtons() {
return [
this.data?.color,
this.data?.price,
this.book?.title,
this.book?.author
].filter(val => val !== undefined);
}
Метод принимает идеальный порядок всех кнопок, затем отфильтровывает значения, которые не существуют.
Затем вы просто повторяете результат в шаблоне:
<button *ngFor="let value of getButtons(); let i = index">
Button <span class="buttonNr">{{i 1}}</span>
</button>
Комментарии:
1. Это может быть реальной проблемой. Спасибо
Ответ №2:
Ваше решение может выглядеть следующим образом
<button *ngFor="let key of obj | keyvalue; let i = index">
Button <span class="buttonNr">1</span>
</button>
Позвольте мне объяснить, что здесь происходит
*ngFor
это директива, которая отображает шаблон для каждого элемента в коллекцииkeyvalue
это специальный канал, который позволяет выполнять итерации по свойствам объектаlet i = index
— экспорт индекса итерации вi
переменную
Обновить
Согласно обновленному ответу, я обновил свое решение для нескольких объектов, включая накопительный счетчик
Здесь вы можете найти простой пример: https://stackblitz.com/edit/angular-ivy-qn8x38?file=src/app/app.component.html
Комментарии:
1. извините, мой первоначальный вопрос был упрощен для того, что мне нужно. Теперь это ближе к моему реальному приложению.
2. Единственным недостатком этого является то, что канал keyvalue будет сортировать ключи, что может быть нежелательно.
3. Вы можете предоставить функцию сортировки для канала keyvalue ( angular.io/api/common/KeyValuePipe )
4. В противном случае вам следует записать все свои свойства вручную, как в решении @AlexK