Angular 5动态创建组件交互

时间:2018-01-12 14:42:31

标签: angular

我想要实现的目标:

第一个组件创建并向服务器发送“Project”实例,之后我需要告诉另一个组件(其中包含现有项目的Project树)来更新树。 我试图在EventEmitter的帮助下做到这一点,但没有任何反应。 显然,如果动态创建发射器组件,这将不起作用。

有什么方法可以解决这个问题?

动态创建的组件:

export class AddProjectComponent implements OnInit {

  newProject: Project;
  newProjectData: NewProjectDataResponse;

  @Output() onProjectAdd = new EventEmitter();

  constructor(private projectService: ProjectsService) {
  }

  ngOnInit() {
    this.newProjectData = new NewProjectDataResponse();
    this.newProject = new Project();
    this.projectService.getNewProjectData()
      .subscribe(
        result => this.newProjectData = result,
        error => this.newProjectData.error = 'Error!'
      );
  }

  onSubmit() {
    this.projectService.addNewProject(this.newProject);
    this.onProjectAdd.emit();
  }

和父组件:

export class ProjectsComponent implements OnInit {

  component: Type<any>;
  injector: Injector;

  private showWp: boolean;

  constructor(private inj: Injector) {
  }

  ngOnInit() {
    this.showWp = false;
  }

  loadProjectDetails(basicProj: BasicProject): void {

    this.component = ProjectComponent;
    this.injector = Injector.create([{provide: BasicProject, useValue: basicProj}], this.inj);
  }

  updateProjectsTree() {
    console.info('Update tree');
  }
}

父comp。的模板:

<div class="basicContainer">
  <div class="projectsTreeContainer">


    <input type="text" id="searchWord" placeholder="Search through projects"/>

    <button (click)="loadAddProject()">Add new Project</button>

    <app-projects-tree (onLoadProjectDetails)="loadProjectDetails($event)"
                       (onLoadWpDetails)="loadWpDetails($event)"
                       (onSelectAndLoadJobDetails)="loadJobDetails($event)">

    </app-projects-tree>
  </div>

  <div class="infoContainer">
    <ng-container *ngComponentOutlet="component; injector: injector" (onProjectAdd)="updateProjectsTree($event)"></ng-container>
  </div>
</div>

1 个答案:

答案 0 :(得分:0)

我找到了解决方案 - 使用专门的服务。该服务看起来像:

@Injectable()
export class TreeUpdateService {

  private update = new Subject();
  updateObservable = this.update.asObservable();

  upd() {
    this.update.next();
  }
}

动态创建comp。服务实施后:

export class AddProjectComponent implements OnInit {

  newProject: Project;
  newProjectData: NewProjectDataResponse;

  constructor(private projectService: ProjectsService, private updateTreeService: TreeUpdateService) {
  }

  onSubmit() {
    this.projectService.addNewProject(this.newProject).subscribe(
      response => {
        alert('Project has been saved successfully');
        this.updateTreeService.upd();
      },
      error => {
        if (error.status === 406) {
          alert('Project with name: ' + this.newProject.name + ' exists already.');
        } else {
          alert('Unknown error has occur.');
        }
      }
    );
  }

要更新的组件:

export class ProjectsTreeComponent implements OnInit {

  constructor(private projectsService: ProjectsService, private updateTreeService: TreeUpdateService) {
    this.updateTreeService.updateObservable.subscribe(
      data => {
        this.updateProjectsTree();
      }
    );
  }