繁体   English   中英

在Angular2中使用ComponentResolver和ngFor创建动态的anchorName / Components

[英]create dynamic anchorName/Components with ComponentResolver and ngFor in Angular2

我需要在ngFor循环中创建唯一的锚名称/组件,以将其与ComponentResolver.resolveComponent一起使用。

<div>
  <table>
    <tr *ng-for="#vIndex of vArr">
      <td *ng-for="#hIndex of hArr">
        <div #uniqueanchorname{{vIndex}}_{{hIndex}}></div>
      </td>
    </tr>
  </table>
</div>

产生的html应该看起来像这样:

<div>
  <table>
    <tr>
      <td>
        <div #uniqueanchorname0_0></div>
      </td>
      <td>
        <div #uniqueanchorname0_1></div>
      </td>
    </tr>
    <tr>
      <td>
        <div #uniqueanchorname1_0></div>
      </td>
      <td>
        <div #uniqueanchorname1_1></div>
      </td>
      <td>
        <div #uniqueanchorname1_2></div>
      </td>
    </tr>
  </table>
</div>

这样我就可以使用DynamicComponentLoader了:

loader.loadIntoLocation(responseDependentComponent, elementRef, 'uniqueAnchorName1_2');

生成的HTML不会被替换,并且将类似于:

<div>
  <table>
    <tr>
      <td>
        <div #uniqueanchorname{{vIndex}}_{{hIndex}}></div>
      </td>
      <td>
        <div #uniqueanchorname{{vIndex}}_{{hIndex}}></div>
      </td>
    </tr>
    <tr>
      <td>
        <div #uniqueanchorname{{vIndex}}_{{hIndex}}></div>
      </td>
      <td>
        <div #uniqueanchorname{{vIndex}}_{{hIndex}}></div>
      </td>
      <td>
        <div #uniqueanchorname{{vIndex}}_{{hIndex}}></div>
      </td>
    </tr>
  </table>
</div>

如果无法创建唯一的锚名称。 还有其他方法可以将组件加载到特定位置吗?

抱歉,发生了误会。

import {
  Directive, 
  Component, 
  View, 
  CORE_DIRECTIVES, 
  ElementRef, 
  DynamicComponentLoader,
  Input,
  QueryList,
  ViewChildren
} from 'angular2/angular2'

@Component({
  selector: 'my-cmp'
})
@View({
  template: 'my component'
})
class MyCmp {}

@Directive({
  selector: '[location]'
})
class Location {
  @Input() h: number;
  @Input() v: number;
  constructor(public elementRef: ElementRef) {
  }
}

@Component({
  selector: 'my-table'
})
@View({
  template: `
  <table border>
    <tr *ng-for="#v of vArr">
      <td *ng-for="#h of hArr">
        <div location v="{{v}}" h="{{h}}">{{v}}-{{h}}</div>
      </td>
    </tr>
  </table>
  h:<input #hi value="1"><br>
  v:<input #vi value="2"><br>
  <button (click)="load(hi.value, vi.value)">load</button>
  `,
  directives: [CORE_DIRECTIVES, Location]
})
class MyTable {
  vArr = [1, 2, 3];
  hArr = [1, 2, 3];
  @ViewChildren(Location) locations: QueryList;
  constructor(
    private loader: DynamicComponentLoader,
    ) {
  }

  load(h, v) {
    let elementRef = null;
    for(let i = 0; i < this.locations._results.length; i++) {
       if(this.locations._results[i].h == h && this.locations._results[i].v ==v) {
         elementRef = this.locations._results[i].elementRef;
       }
    }

    if(elementRef) {
      this.loader.loadNextToLocation(MyCmp, elementRef);
    }
  }
}

@Component({
  selector: 'my-app'
})
@View({
  template: `<my-table></my-table>`,
  directives: [MyTable]
})
export class App {}

http://plnkr.co/edit/dqfPCW3MBa9hM23EW3cS?p=preview这是您需要的吗?

Angular2 rc.0的解决方案

HTML:

<div style="display: block">
  <table>
    <tr *ngFor="let v of arr; let i = index">
      <td *ngFor="let h of arr[i]; let j = index">
        <div location v="i" h="j"></div>
      </td>
    </tr>
  </table>
</div>

位置指令:

@Directive({
  selector: '[location]'
})
class Location {
  @Input() h: number;
  @Input() v: number;

  constructor(public viewContainerRef: ViewContainerRef) {
  }
}

零件

@Component({
  selector: 'example-cmp',
  directives: [CORE_DIRECTIVES, Location]
})
export class ExampleComponent implements AfterViewInit {
  public arr: Array<Array<number>> = [];
  public componentRef: ComponentRef<any>;

  @ViewChildren(Location) private locations: QueryList<Location>;

  constructor(private resolver: ComponentResolver) {
  }

  ngAfterViewInit() {
    this.loadTag(0,0,SomeViewComponent);
  }

  loadTag(x:number, y:number, component) {
    let viewContainerRef: ViewContainerRef = null;
    let locs = this.locations.toArray();
    for (let i = 0; i < locs.length; i++) {
      if (+locs[i].h === x && +locs[i].v === y) {
        viewContainerRef = locs[i].viewContainerRef;
      }
    }
    if (viewContainerRef != null) {
      var injector = ReflectiveInjector.fromResolvedProviders(ReflectiveInjector.resolve([
        provide(NeededAttribute, { useValue: 42 })]),
        this.componentRef.injector);

      this.resolver.resolveComponent(component).then((factory: ComponentFactory<any>) => {
        var compRef: ComponentRef<any> = viewContainerRef.createComponent(factory, -1, injector);
      });
    }
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM