[英]Angular Parent-Child Component: Load Child on Parent click
我有文章列表和文章詳細信息組件。
文章列表:-文章列表。 以表格的形式加載到html中。 處理了click事件並設置了商品ID-使用商品ID屬性向商品詳細信息發送信號以作為@Input屬性加載。
文章詳細信息:-@Input屬性從列表中偵聽並注冊ng-OnChange事件以處理任何更改-加載文章詳細信息視圖模型(具有更多詳細信息)–使用反應性表單加載所有屬性以更正表單組。 -使用示例屬性並在具有Reactive表單屬性的UI中顯示,只是要知道@Input屬性正在從列表中獲取正確的值。
現在,我在Sample屬性中獲得了正確的值。 並且從“文章詳細信息”更改事件中調用服務方法。 它還設置了視圖模型。 但是這里的問題是,視圖顯示一鍵單擊舊數據。
如果單擊第二篇文章,則示例屬性會正確更新,這證明我的詳細信息組件會獲取信息,並且最終視圖模型也會在服務響應后得到更新。 但視圖會顯示舊的視圖模型。
每次單擊最后一次存儲的ViewModel數據都會顯示在View上。 知道為什么嗎? 這是代碼:
**#Article-List Component.ts**
@Component({
selector: 'admin-article-list',
templateUrl: './article-list.component.html',
styleUrls: ['./article-list.component.css']
})
export class ArticleListComponent extends BaseImplementationComponent {
public selectedArticleId: string;
articleClick(event: Event, articleViewModel: ArticleViewModel) {
this.selectedArticleId = articleViewModel.articleId;
}
}
**#Article-List-Html**
<div *ngFor="let article of articles">
<div class="row article" (click)="articleClick($event, article)">
<div class="col-xs-3 col-sm-3">
<a href='{{article.articleId}}'>{{article.articleId}}</a>
</div>
</div>
<div>
<admin-article-detail *ngIf="isReadyToLoad" [articleId]="selectedArticleId"></admin-article-detail>
</div>
</div>
**#Article-Detail-Component.ts**
@Component({
selector: 'admin-article-detail',
templateUrl: './article-detail.component.html',
styleUrls: ['./article-detail.component.css']
})
export class ArticleDetailComponent extends BaseImplementationComponent {
@Input()
articleId: string;
articleViewModel: ArticleViewModel;
articleDetailFormGroup: FormGroup;
constructor(private formBuilder: FormBuilder, private articleService: ArticleService) {super();
this.createArticleDetailForm();
}
protected ngOnChangesAtBaseComponent(): void {
this.loadArticleDetail();
this.patchArticleDetailForm();
this.articleIdComingfromParent = this.articleId;
}
private loadArticleDetail() {
this.articleService.getArticle(this.articleId)
.map(item => this.articleViewModel = item)
.subscribe(
(item) => {
console.log(item);
this.articleViewModel = item;
},
(err) => {
console.log(err);
});
}
private patchArticleDetailForm() {
//console.log(this.articleViewModel.articleTitle);
this.articleDetailFormGroup.get('articleBasicDetail').patchValue({
articleTitle: this.articleViewModel.articleTitle });
}
private createArticleDetailForm() {
this.articleDetailFormGroup = this.formBuilder.group({
articleBasicDetail: this.formBuilder.group({
articleTitle: ''
})
});
}
}
**#Article-Detail-Html**
<form class="form-horizontal" [formGroup]="articleDetailFormGroup">
<div class="form-group" formGroupName="articleBasicDetail">
<div class="col-sm-12">
<label for="articleTitle" class="center-block">Street:
<input type="text" id="articleTitle" class="form-control" formControlName="articleTitle">
Updated from: {{articleIdComingfromParent}}
</label>
</div>
</div>
</form>
我認為如果輸入的引用發生更改,子組件將觸發更改,您會遇到此錯誤,因為直接更改輸入,這是使用OnPush檢測策略和doCheck的解決方案
@Component({
selector: 'admin-article-detail',
templateUrl: './article-detail.component.html',
styleUrls: ['./article-detail.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush
})
@Input() articleId: string;
selectedArticle : string; // create this new property and use it
constructor(private cd: ChangeDetectorRef) {}
ngOnInit() { this.selectedArticle = this.articleId; }
ngDoCheck() {
if (this.selectedArticle !== this.articleId) {
this.selectedArticle = this.articleId;
this.cd.markForCheck();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.