Ionic 3 уникальные кнопки

Я новичок в Ionic и использую Ionic v3.

У меня есть * ngFor Repeater, отображающий список карточек, и каждая карточка содержит изображение и кнопку под каждым изображением, Как сделать кнопку уникальной. Я хочу, чтобы только нажатая кнопка под изображением меняла свое имя и цвет. теперь код меняет все кнопки на визуализированных карточках.

<ion-card no-padding padding-bottom no-margin class = "card" *ngFor = "let c of cards;">

<ion-row>
  <img src = {{c.Image}} />
</ion-row>

 <button clear ion-button icon-only (click) = "likeButton(c)" class = "like-btn">
    <ion-icon no-padding [name] = "like_btn.icon_name" color = "{{ like_btn.color }}" class = "icon-space"></ion-icon>
</button>

</ion-card>

и вот это .ts

likeButton(c: any) {
   if (this.like_btn.icon_name === 'heart-outline') {
      this.like_btn.icon_name = 'heart';
      this.like_btn.color = 'danger';
      // Do some API job in here for real!
   }
   else {
      this.like_btn.icon_name = 'heart-outline';
      this.like_btn.color = 'black';
   }
}

Массив данных

У вас есть 3 страницы. На каждой странице должна быть своя кнопка "Мне нравится", со своим цветом и значком. Таким образом, цвет и значок должны быть свойствами страницы, а не свойствами компонента, отображающего все страницы. В противном случае у вас будет только один цвет и один значок. Или вы можете иметь компонент кнопки Like и использовать один такой компонент для каждой страницы.

JB Nizet 30.06.2018 15:38

@JBNizet спасибо за ответ, я отредактировал свой вопрос, чтобы он был более понятным. Не могли бы вы взглянуть на это и сообщить мне, потому что я не совсем понял ваше решение.

Nazir Massaad 30.06.2018 15:56

Если вам нужна красная кнопка на первой карте, зеленая кнопка на второй и синяя кнопка на третьей карте, вам нужно иметь три разных цветовых переменных, а не только одну. Если бы у вас было 1000 карточек, вам понадобилось бы 1000 переменных. Здесь есть прямая корреляция: каждая карта должна иметь свой цвет и, следовательно, свою собственную переменную, чтобы содержать этот цвет. Поэтому вместо того, чтобы сохранять цвет на this (то есть на уникальном компоненте), вам нужно сохранить его на самой карте: <ion-icon ... [color] = "c.color" ...>. likeButton(c: Card) { if (c.icon_name === 'heart-outline') { ....

JB Nizet 30.06.2018 16:04

@JBNizet .. мне нужна кнопка с сердечком, такая же, как в instagram. поэтому каждая нажатая кнопка будет окрашена в красный цвет, а при повторном нажатии снова станет черным. с чем я столкнулся, так это то, что при нажатии все кнопки окрашиваются в красный цвет, а не только нажатая.

Nazir Massaad 30.06.2018 16:24

Да, я это прекрасно понимаю. Вы читали мои комментарии? Что в этом непонятного? Что ты не понимаешь? Допустим, у вас есть класс Component. И этот класс Component имеет массив из 3 человек. У каждого человека должно быть свое имя. Где следует определить свойство name? На объекте "Компонент" или на объектах "Пользователь"? То же самое. У вас есть 3 карты, каждая с цветом. Где следует определять цвет? На компоненте или на карте?

JB Nizet 30.06.2018 16:25

Можете поделиться своим нынешним массивом - карточками?

Sergey Rudenko 30.06.2018 17:31

@SergeyRudenko добавил в описание ссылку на массивы: i.stack.imgur.com/ngSnZ.png

Nazir Massaad 30.06.2018 17:55

@JBNizet да, я прочитал ваш комментарий, и я работаю над вашими предложениями.

Nazir Massaad 30.06.2018 17:55

@JBNizet теперь работает. К сожалению, я пока не могу выбрать ваш ответ. Мне нужно заработать какие-то значки.

Nazir Massaad 02.07.2018 09:57

Я только комментировал, ответа нет. Не беспокойся об этом. Вы можете просто удалить свой вопрос: многие похожие вопросы уже были заданы и даны ответы.

JB Nizet 02.07.2018 11:03
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
0
10
153
1

Ответы 1

Вместо этого я бы добавил атрибут к объекту карты в массиве, который хранит, является ли он `` понравившимся '' (например, логическим), тогда в вашем представлении вы можете перебирать массив и обновлять конкретную карту, когда пользователь нажимает кнопку :

<ion-card no-padding padding-bottom no-margin class = "card" *ngFor = "let c of cards>

<ion-row>
  <img src = {{c.Image}} />
</ion-row>

 <button clear ion-button icon-only (click) = "likeButton(c)" class = "like-btn">
    <ion-icon no-padding [name] = "c.liked ? 'heart' : 'heart-outline'" [color] = "c.liked ? 'danger' : 'black'" class = "icon-space"></ion-icon>
</button>

</ion-card>

Затем в вашем методе likeButton:

likeButton(c: any) {
   if (c.liked) {
      c.liked = false // Update the array which should also update your view  
      // Do whatever you want when a card is changed to not liked.
   } else {
      c.liked = true // Update the array which should also update your view  
      // Do whatever you want when a card is changed to liked.
   }
}

Другие вопросы по теме