我有一个名为“节点”的组件,该组件应该显示一个帖子,但是我不止一个帖子类型,而且每种类型都有自己的 View (布局)。
因此,此组件具有一个ID参数,该参数将用于从服务获取帖子响应,然后根据帖子类型显示正确的布局。
例如:localhost/test_app/node/123,其中123是id参数。
方法1:在模板中使用ngIf

@Component({
  selector: 'node',
  directives: [Post, Project],
  template: `
    <post *ngIf="response.post.post_type == 'post'" content="response.post"></post>
    <project *ngIf="response.post.post_type == 'project'" content="response.post"></project>
  `,
})

export class Node{

  id: number;
  response: any;
  constructor(private _param: RouteParams,
              public service: Service
  ){
    this.id = +_param.get('id');
  }

  ngOnInit(){
    this.service.get(this.id).subscribe(
      res=> this.response = res.json()
    );
  }

}
方法2:使用动态组件加载程序。
@Component({
  selector: 'node',
  directives: [Post, Project],
  template: '<div #container></div>'
})

export class Node{

  id: number;
  response: any;

  constructor(private _param: RouteParams,
              public service: Service,
              private loader:DynamicComponentLoader,
              private elementRef:ElementRef
  ){
    this.id = +_param.get('id');
  }

  ngOnInit(){
    this.service.get(this.id).subscribe(
      res=> {
          this.response = res.json();
          this.renderTemplate();
      }
    );
  }

  renderTemplate(template) {
    this.loader.loadIntoLocation(
      this.getCorrectTemplate(),
      this.elementRef,
      'container'
    )
  }

  getCorrectTemplate(){
    if(this.response.post.post_type == "post"){
        return '<post content="response.post"></post>';
    }
    else{
        return '<project content="response.post"></project>';
    }
  }

}
我想知道哪种方法更有效,或者如果有更好的方法,请分享。

最佳答案

如果您的模板数量有限,那么*ngIf*ngSwitch是一个不错的方法。它允许您在父级和子级之间使用[]()绑定(bind)。

如果您有一组静态未知的模板,例如由参数提供,则*ngIf不起作用。然后ViewContainerRef.createComponent()(代替DynamicComponentLoader)是正确的方法。有关示例,请参见Angular 2 dynamic tabs with user-click chosen components

关于Angular2根据服务响应动态选择模板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37649358/

10-17 03:01