您能告诉我如何在父页面中访问内部子页面的公共变量吗?即我需要访问此变量offlineArticlesCount
。
注意:以下所有3个组件都有自己的modules
。
myPage.html - 父页
<picks *ngFor="let pick of pickData" [data]="pick"></picks>
<p>{{instance.offlineArticlesCount}}</p> //How to do this?
myPage.ts
@ViewChild(DownloadOfflineArticleComponent) instance: DownloadOfflineArticleComponent;
picks.html
<download-offline-article [data]="data" (onDownloadOfflineArticle)="downloadOfflineArticle($event)"></download-offline-article>
download-offline-article.ts - 内部儿童组件
export class DownloadOfflineArticleComponent {
offlineArticlesCount: number = 0;
constructor(){}
downloadOfflineArticle() {
this.articleService.downloadOfflineArticle(this.data.id)
.subscribe((res: any) => {
this.onDownloadOfflineArticle.emit(true);
this.localCacheService.clearMyLibraryPageCacheGroup().then(() => {
this.getAllMyPurchasedOfflineArticles().subscribe((res: any) => {
this.offlineArticlesCount = res.count;//here is the place where it updates
},
error => { },
() => { });
});
},
error => { },
() => { });
}
}
答案 0 :(得分:1)
只需一行:
@ViewChild(DownloadOfflineArticleComponent) childComp: DownloadOfflineArticleComponent;
然后使用{{ childComp?.offlineArticlesCount }}
答案 1 :(得分:1)
两个答案都是正确的,它只取决于你想从子组件使用该属性的位置。
如果您只想在视图中显示,可以使用模板参考变量
<picks *ngFor="let pick of pickData" [data]="pick"></picks>
<p>{{ offlineArticle.offlineArticlesCount }}</p>
<download-offline-article #offlineArticle ..."></download-offline-article>
这样,您就不会在父组件代码中创建子组件的实例。
如果要在组件代码中使用该属性,最好的方法是使用ViewChild
获取子组件的实例:
// Parent component code...
@ViewChild(DownloadOfflineArticleComponent) childComponent: DownloadOfflineArticleComponent;
当然,您可以在视图中使用它:
<!-- Your view -->
{{ childComponent?. offlineArticlesCount}}
修改强>
由于您有一个更复杂的组件层次结构,我认为解决此问题的最佳方法是使用共享服务,您可以在其中存储所有共享信息。这样,您就可以通过应用中的任何组件(或页面)以更简单的方式访问该数据。
答案 2 :(得分:1)
在您编辑问题以阐明组件层次结构后,我认为解决问题的最佳方法是使用共享服务来共享组件之间的数据:
// Create the shared service like below:
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Observable } from 'rxjs';
@Injectable()
export class SharedService {
private articleCountSubject: BehaviorSubject<any> = new BehaviorSubject({});
setArticleCount(count: any): void {
this.articleCountSubject.next(count);
}
getArticleCount(): Observable<any> {
return this.articleCountSubject.asObservable();
}
}
// myPage.ts:
constructor(private sharedService: SharedService){}
ngOnInit() {
this.sharedService.getArticleCount().subscribe(count=> {
this.offlineArticlesCount = count;
});
}
// myPage.html:
<picks *ngFor="let pick of pickData" [data]="pick"></picks>
<p> {{offlineArticlesCount }} </p>
// download-offline-article.ts:
//...
this.getAllMyPurchasedOfflineArticles().subscribe((res: any) => {
this.sharedService.setArticleCount(res.count);
},
//...
答案 3 :(得分:0)
使用模板参考变量:
<picks *ngFor="let pick of pickData" [data]="pick"></picks>
<p>{{ offlineArticle.offlineArticlesCount }}</p>
<download-offline-article #offlineArticle [data]="data" (onDownloadOfflineArticle)="downloadOfflineArticle($event)"></download-offline-article>