связать изображение динамически Angular 8 - PullRequest
1 голос
/ 26 сентября 2019

У меня есть object array, который мне нужно добавить значок изображения динамически в зависимости от типа кредитной карты,

TS файл

  icon: any;

  savedCreditCard = 
  [
  {
    cardExpiryDateFormat: "05/xx",
    cardNumberLast: "00xx",
    cardId: "xxx",
    cardType: "Mastercard",
    cardExpiryDate: "xx05",
    paymentChannelId: 9,
    cardNumberMasked: "512345XXXXXXXXXX"
  },
  {
    cardExpiryDateFormat: "11/xx",
    cardNumberLast: "58xx",
    cardId: "xxx",
    cardType: "Amex",
    cardExpiryDate: "xx11",
    paymentChannelId: 16,
    cardNumberMasked: "379185XXXXXXXXX"
  }
]

  ngOnInit() {
        this.savedCreditCard.forEach((x => {
      if (x.cardType === 'Mastercard') {
        this.icon = '../../assets/svg/logo-mastercard.svg';
      } else if (x.cardType === 'Amex') {
        this.icon = '../../assets/svg/icon-amex.svg';
      }
    })
    );
  }

и по шаблону HTML, Я пытаюсь привязать изображение динамически в зависимости от типа кредитной карты, это то, что я пытался,

HTML-файл

    <div class="flex-float">
      <div class="float-end">
        <img class="select--icon" [src]="icon" />
        <p class="selected--desc is-hidden-mobile-xs">
          {{ selectedCard.cardType }}
        </p>
      </div>
    </div>

проблема в том, что я только получилта же иконка, хотя это mastercard или amex, я хочу воспроизвести на stackblitz, но не поддерживается статическое изображение, кто-нибудь знает, как решить это или любое предложение?

1 Ответ

2 голосов
/ 26 сентября 2019

Существует только одна переменная icon, и ей присваивается новый путь к значку на каждой итерации forEach().И этот icon используется для всех карт, поэтому отображается только одно изображение.

Подход 1:

У вас может быть объект с иконками, такими как

var icons = {
 'Mastercard': '../../assets/svg/logo-mastercard.svg',
 'Amex': '../../assets/svg/icon-amex.svg'
}; 

А в HTML просто используйте соответствующий значок в зависимости от типа карты.

<div class="flex-float">
  <div class="float-end">
    <img class="select--icon" [src]="icons[selectedCard.cardType]" />
      <p class="selected--desc is-hidden-mobile-xs">
        {{ selectedCard.cardType }}
      </p>
  </div>
</div>

Нет необходимости вносить какие-либо изменения в массив saveCreditCard в ngOnInit().

Подход 2:

Если вы хотите сохранить значок на каждом объекте в saveCreditCard, тогда можно использовать Array.map () .

В ngOnInit() назначьте значок каждой кредитной карте.

ngOnInit() {
  this.savedCreditCard = this.savedCreditCard.map(card => {
    let icon;
    if (card.cardType === 'Mastercard') {
      icon = '../../assets/svg/logo-mastercard.svg';
    } else if (card.cardType === 'Amex') {
      icon = '../../assets/svg/icon-amex.svg';
    }

    return {...card, "icon": icon};
  }); 
}

Затем в HTML используйте свойство icon карты.

<div class="flex-float">
  <div class="float-end">
    <img class="select--icon" [src]="selectedCard.icon" />
      <p class="selected--desc is-hidden-mobile-xs">
        {{ selectedCard.cardType }}
      </p>
  </div>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...