首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角度父子组件:在父项单击时加载子组件

角度父子组件:在父项单击时加载子组件
EN

Stack Overflow用户
提问于 2018-05-06 04:05:22
回答 1查看 1.7K关注 0票数 0

我有文章列表和文章详细组件。

文章列表:--文章列表。以表格形式加载到html中。处理了一个单击事件并设置了文章id --使用文章id属性向文章详细信息发送一个信号,以加载为@Input属性。

文章细节:-- @Input property侦听列表并注册ng-OnChange事件以处理任何更改--加载文章详细视图模型(具有更多细节) --使用反应式表单加载所有属性以更正formgroup。--使用sample属性并在UI中显示反应式窗体属性,只需知道@Input属性正在从列表中获取正确的值。

现在,我在Sample属性中得到了正确的值。服务方法也是从文章详细信息更改事件中调用的。它还设置了视图模型。但这里的问题是,View只需单击一次即可显示旧数据。

如果我单击第二篇文章,我的示例属性会正确更新,这证明我的detail组件会获得信息,最终视图模型也会在服务响应后更新。但View显示的是旧的View Model。

每次单击最后一次存储的视图模型数据都会显示在视图上。知道为什么吗?下面是代码:

代码语言:javascript
复制
 **#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>
EN

回答 1

Stack Overflow用户

发布于 2018-05-06 05:33:02

我认为如果输入的引用发生变化,子组件将触发更改,您会出现此错误,因为您正在直接更改输入,这是一个使用OnPush检测策略和doCheck的解决方案

代码语言:javascript
复制
 @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();
  }
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50193561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档