使用[ngClass]条件只能正确显示一个字体真棒图标

问题描述 投票:2回答:1

我正在构建一个用户配置文件,用户可以在其中提交指向其社交媒体帐户的链接。每个帐户都有一个可点击的链接。应该选择哪个图标取决于[ngClass]中的多个条件,下面是代码:

    <div *ngIf="socialMediaLinkList.length > 0" class="topic">
            <strong>can be followed on:</strong>
                <a *ngFor="let socialMediaLink of socialMediaLinkList" [href]="socialMediaLink.link">
                    <i [title]="socialMediaLink.socialMediaType" 
                    [ngClass]="{
                        'fa fa-youtube':socialMediaLink.socialMediaType === 'YOUTUBE',
                        'fa fa-facebook-official':socialMediaLink.socialMediaType === 'FACEBOOK',
                        'fa fa-twitter':socialMediaLink.socialMediaType === 'TWITTER',
                        'fa fa-reddit':socialMediaLink.socialMediaType === 'REDDIT',
                        'fa fa-pinterest':socialMediaLink.socialMediaType === 'PINTEREST',
                        'fa fa-linkedin-square':socialMediaLink.socialMediaType === 'LINKEDIN',
                        'fa fa-instagram':socialMediaLink.socialMediaType === 'INSTAGRAM',
                        'fa fa-google-plus':socialMediaLink.socialMediaType === 'GOOGLE_PLUS',
                        'fa fa-tumblr-square':socialMediaLink.socialMediaType === 'TUMBLR',
                        'fa fa-vimeo-square':socialMediaLink.socialMediaType === 'VIMEO',
                        'fa fa-vk':socialMediaLink.socialMediaType === 'VKONTAKTE',
                        'fa fa-weibo':socialMediaLink.socialMediaType === 'WEIBO',
                        'fa fa-renren':socialMediaLink.socialMediaType === 'RENREN',
                        'fa fa-odnoklassniki':socialMediaLink.socialMediaType === 'ODNOKLASSNIKI',
                        'fa fa-flickr':socialMediaLink.socialMediaType === 'FLICKR'
                }"></i>
                </a> 
        <mat-divider></mat-divider>
    </div>

问题是只有条件列表中的最后一个图标才能正确显示,所有其他图标都显示为统一块,如下所示:

enter image description here

这只是因为FLICKR恰好位于随机生成的社交媒体帐户列表中。如果FLICKR不是该列表的一部分,那么所有社交媒体帐户图标将是块。例如,如果我用FLICKR交换ODNOKLASSNIKI的条件,那么事情就会改变,使得ODNOKLASSNIKI成为最后一个。现在Odnoklassniki是唯一可以正确显示的图标。

我跟着ngclass例子在这里https://codecraft.tv/courses/angular/built-in-directives/ngstyle-and-ngclass/和我,因为我担心我没有犯任何错误。

下面是如何使用SocialMediaLink类初始化列表

export class SocialMediaLink{
  constructor(public socialMediaType:string, public link: string){}
}

if(this.aboutSection.socialMediaAccounts !== undefined){
    this.selectedSocialMediaAccounts = new Map<SocialMedia,string>((<any>Object).entries(this.aboutSection.socialMediaAccounts));
    this.selectedSocialMediaAccounts.forEach((link: string, socialMediaType:SocialMedia) => 
    this.socialMediaLinkList.push(new SocialMediaLink(socialMediaType.toString(), link)));
} 

任何人都可以告诉我如何解决这个问题?谢谢

编辑:这是字体真棒cdn我正在使用@import'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css';

angular typescript ng-class
1个回答
5
投票

在你的ngClass绑定中,如果条件是true,它设置fa类。但是,以下条件,即false,将其删除。这就是为什么fa类只在最后一个条件是true时才被保留。

你应该在条件fa绑定之外设置公共类ngClass

<i [title]="socialMediaLink.socialMediaType" 
  class="fa" 
  [ngClass]="{
    'fa-youtube': socialMediaLink.socialMediaType === 'YOUTUBE',
    'fa-facebook-official': socialMediaLink.socialMediaType === 'FACEBOOK',
    'fa-twitter': socialMediaLink.socialMediaType === 'TWITTER',
    'fa-reddit': socialMediaLink.socialMediaType === 'REDDIT',
    'fa-pinterest': socialMediaLink.socialMediaType === 'PINTEREST',
    'fa-linkedin-square': socialMediaLink.socialMediaType === 'LINKEDIN',
    'fa-instagram': socialMediaLink.socialMediaType === 'INSTAGRAM',
    'fa-google-plus': socialMediaLink.socialMediaType === 'GOOGLE_PLUS',
    'fa-tumblr-square': socialMediaLink.socialMediaType === 'TUMBLR',
    'fa-vimeo-square': socialMediaLink.socialMediaType === 'VIMEO',
    'fa-vk': socialMediaLink.socialMediaType === 'VKONTAKTE',
    'fa-weibo': socialMediaLink.socialMediaType === 'WEIBO',
    'fa-renren': socialMediaLink.socialMediaType === 'RENREN',
    'fa-odnoklassniki': socialMediaLink.socialMediaType === 'ODNOKLASSNIKI',
    'fa-flickr': socialMediaLink.socialMediaType === 'FLICKR'
  }"></i>

有关演示,请参阅this stackblitz


另一种解决方案是将fa保持在ngClass绑定中,并将其条件设置为true

<i [title]="socialMediaLink.socialMediaType" 
  [ngClass]="{
    'fa': true,
    'fa-youtube': socialMediaLink.socialMediaType === 'YOUTUBE',
    ...
  }"></i>
© www.soinside.com 2019 - 2024. All rights reserved.