Angular2:使用DynamicComponentLoader动态插入的组件上的双向数据绑定

时间:2015-11-03 16:13:26

标签: data-binding angular

我正在开发一个Angular2应用程序,我遇到了一个问题:

我有一组可以使用UI选择的不同对象。每个对象都有一组可以使用UI编辑的选项(不同对象不同)。现在,我正在使用DynamicComponentLoader为当前选定的对象插入特定组件,因此它可以正确处理其选项。 问题是我不知道如何将当前所选对象的数据绑定到动态插入的选项组件。

@Component({
  selector: 'dynamic',
  template: `<div>Options:</div>
             <div>Property1: <input type="number" /></div>
             <div>Property2: <input type="text" /></div>`
  // template: `<div>Options:</div>
  //           <div>Property1: <input type="number" [(ng-model)]="currentSelection.property1" /></div>
  //           <div>Property2: <input type="text" [(ng-model)]="currentSelection.property1" /></div>`
})
class DynamicComponent {

}


@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Selected: {{currentSelection.name}}!</h2>
      <div  #container></div>
    </div>
  `
})
class App {
  currentSelection = {name: 'Selection1', property1: 10, property2: 'test'};

  constructor(private loader: DynamicComponentLoader, private elementRef: ElementRef) {
    loader.loadIntoLocation(DynamicComponent, elementRef, 'container');
  }
}

Here是一位帮助您理解我的问题的人:

2 个答案:

答案 0 :(得分:4)

使用angular2和Rxjs,&#34; Observables&#34;几乎总是答案。

如果我理解你的问题,你需要让你的DynamicComponent成为&#34; Observer&#34;和你的容器&#34; Observable或更好的Subject(如果你的容器需要订阅另一个observable来接收选择)&#34;。然后,在加载动态组件后,将其订阅到您的容器。

每当您的容器上的选择发生更改时,您都会将新选择推送给订阅者。这样,您可以加载多个动态组件,并且所有组件都将接收您的推送。

容器:

class App {
  currentSelection = {};
  selections = [
    {name: 'Selection1', property1: 10, property2: 'test'},
    {name: 'Selection2', property1: 20, property2: 'test2'}
  ];
  subject:Subject<any> = new Subject();

  constructor(private loader: DynamicComponentLoader, private elementRef: ElementRef) {
  }

  ngOnInit(){
    this.loader.loadIntoLocation(DynamicComponent, this.elementRef, 'container', this.injector)
    .then(compRef =>this.subject.subscribe(compRef.instance));
    // subscribe after loading the dynamicComponent
  }

  // set the new selection and push it to subscribers
  changeSelection(newSelection){
    this.currentSelection = newSelection;
    this.subject.next(this.currentSelection);
  }
}

观察员:

class DynamicComponent implements Observer{
  public currentSelection = {};

  next(newSelection){
    this.currentSelection = newSelection;
  }
}

以下是您的plunker在我的编辑后工作,&#34;前提是我将导入更改为最新的角度测试版.6&#34;

我知道这是一个很老的问题。但希望有人能从这个答案中受益。

答案 1 :(得分:2)

您可以执行以下操作,将代码从constructor移至ngOnInit,并使用promises分配动态值。

ngOnInit(){
    this.dynamicComponentLoader.loadIntoLocation(DynamicComponent, this.elementRef,'container').then((component)=>{
        component.instance.currentSelection = currentSelection;
    });
}