【问题标题】:Pass value to component to toggle *ngIf将值传递给组件以切换 *ngIf
【发布时间】:2021-06-18 21:48:02
【问题描述】:

首先:对不起我的英语不好,它不是我的母语。

我的问题:我有一个 home.ts 和一个子组件 newsslider.ts。当在我的新闻滑块中调用一个函数时,我会通过 ngif 隐藏该块并且当调用完成时再次可见。

但是如果我从家里调用这个函数,刷新效果很好,但它不会隐藏。

这是我的代码: Home.html

 <ion-refresher slot="fixed" (ionRefresh)="doRefresh($event)">
    <ion-refresher-content
            pullingIcon="chevron-down-circle-outline"
            color="primary"
            pullingText="Ziehen zum Neuladen"
            refreshingSpinner="circles"
            refreshingText="Aktualisiere Daten">

    </ion-refresher-content>
</ion-refresher>

Home.ts

 @Component({
    selector: 'app-home',
    templateUrl: './home.page.html',
    styleUrls: ['./home.page.scss'],
})
export class HomePage implements OnInit, DoCheck {

    constructor(
        public newsslider: NewssliderComponent
    ) {
    }



    doRefresh(event) {
        this.newsslider.getApiNews().then((data:any) => {

        })

        setTimeout(() => {
            event.target.complete();
        }, 2000);
    }

Newsslider.ts

@Component({
    selector: 'app-newsslider',
    templateUrl: './newsslider.component.html',
    styleUrls: ['./newsslider.component.scss'],
})
export class NewssliderComponent implements OnInit {
    public data:boolean = false;
    public sliderItems:any;
    public locations:any;

 

    constructor(
        public router: Router,
        public HttpService: HttpService,
        public locationpage: LocationPage,
        public ngZone: NgZone,
        public events: EventsService,
    ) {
    }

 

    getApiNews() {
        return new Promise(resolve => {
            this.data = false;
            this.ngZone.run(() => {
                console.log("executed");
                this.data = false;
                this.FavoriteLocationIdToString().then((string:string) => {
                    let baseApi = 'XXXXX';
                    let ApiCall = baseApi.concat(string);
                    this.HttpService.get(ApiCall).then((data: any) => {
                        this.sliderItems = JSON.parse(data.data)
                        this.data = true;
                        resolve(this.sliderItems);
                    }, error => {

                    });
                });
            });
        })
    }

newsslider.html

<div *ngIf="data" class="aktuell__content">

            <ion-slides class="aktuell-slider" pager="true"
                        [options]="slideOpts">
                <ion-slide *ngFor="let item of sliderItems; let i = index">
                    <div class="aktuell-slider__item">
                        <span>{{item.date * 1000 | date:'dd.MM.yyyy HH:mm'}} Uhr</span>

                        <h3>{{item.title}}</h3>

                        <p>{{item.formatedBodyHtml | striphtml | slice:0:120}}...</p>

                        <a [routerLink]="['/browser', item.detailPageUrl]"
                           href="#" class="more">
                            weiterlesen
                        </a>

                        <ul class="btn-list">
                            <li *ngIf="item.topNews == 1" class="btn-list__item btn-list__item--highlighted">
                                <span>top</span>
                            </li>
                            <ng-container *ngIf="item.sites.length <= 3">
                                <li *ngFor="let site of item.sites" class="btn-list__item">

                                    <span>{{site.title}}</span>

                                </li>
                            </ng-container>
                

    </ul>


                </div>
            </ion-slide>
        </ion-slides>


    </div>
    <div *ngIf="!data" class="aktuell__content">
        <div class="ion-padding custom-skeleton">
            <ion-skeleton-text animated style="width: 60%"></ion-skeleton-text>
            <ion-skeleton-text animated></ion-skeleton-text>
            <ion-skeleton-text animated style="width: 88%"></ion-skeleton-text>
            <ion-skeleton-text animated style="width: 70%"></ion-skeleton-text>
            <ion-skeleton-text animated style="width: 60%"></ion-skeleton-text>
        </div>
    </div>

newsslider.ts 中的 console.log 说,this.data 由 true 变为 false 变为 true,完全没问题。但在前端视图中我看不到它。

作为一种解决方法,我创建了一个触发该功能的事件,但我不认为这是正确的方法。

我希望你们能在这里帮助我。随时提问。

谢谢

【问题讨论】:

    标签: angular typescript ionic-framework ionic5


    【解决方案1】:

    您可以在子组件上使用@Input,从父组件传递数据值。将父组件的初始值设置为false,然后使用@Output 发出事件以将父组件中的值设置为它需要的任何值。

    <parent-component>
      <child-component [data]="data" (dataChanged)="changeData($event)"></child-component>
    </parent-component>
    

    您的家将定义

    data = false;
    
    changeData(event){
      this.data = event
    }
    

    还有新闻滑块

    @Input() data
    
    @Output() dataChanged = new EventEmmiter<boolean>()
    

    以及当你想改变父组件中数据的值时

    this.dataChanged.emit(true)
    or
    this.dataChanged.emit(false)
    

    这里有更多关于输入和输出的信息https://angular.io/guide/inputs-outputs

    【讨论】:

    • 太好了,成功了。谢谢你。只需对您的解决方案进行一个小编辑。我必须在输入和输出处使用大括号,例如@Input() 数据
    • @Trommelpeter 很高兴为您提供帮助!我已经更新了示例
    猜你喜欢
    • 2017-08-20
    • 2019-08-09
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2020-02-04
    • 2021-09-02
    相关资源
    最近更新 更多