2015-10-06 20 views
7

ComponentResolver.resolveComponent ile kullanmak için bir ngFor döngüsünde benzersiz Anchor Adları/Bileşenleri oluşturmanız gerekir.dinamik anchorName/Bileşenleri Angular2 içinde ComponentResolver ve ngFor ile oluştur

<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> 

önüne aldığımızda ben gibi DynamicComponentLoader kullanabilirsiniz::

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

elde edilen HTML yerini almaz ve bir şey olacaktır

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

çıkan html böyle bir şey görünmelidir gibi:

<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> 

Benzersiz bağlantı adları oluşturulamıyorsa. Bileşenleri belirli bir yere yüklemek için başka bir yolu var mı?

+0

Eğer # 'gibi bir şey {{' deneyebilirsiniz

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

Bileşen uniqueAnchorName '+ vIndex +' _ '+ hIndex}} –

+0

Sorununuzu gerçekten anlamıyorum. İşe yaradı mı? Yapmadı mı? Denemedim ama görebildiğim tek şey, değişken isminde büyük harf kullanmanın gerçeği. Eğer 'uniqueAnchorName' yazıyorsanız, tarayıcı ng2 derlemeden önce 'uniqueanchorname' olarak küçük harfle yazacaktır. –

+0

@PankajParkar bıyık ({{xxx}}) özniteliklerde yerini almaz, sonuçta ortaya çıkan html hala ipucu için #uniqueAnchorName {{vIndex}} _ {{hIndex}} –

cevap

4

Üzgünüz, bir yanlış anlaşılma oldu.

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

ne gerek bu mu? Angular2 rc.0 için

+0

Çözümünüz, ihtiyacım olan şeyi yapıyor. Sadece referans olması için pek çok Direktif oluşturması biraz rahatsızlık verici. Benim rakibimde referans olarak dize-çapalar oluşturabilirsek daha iyi olurdu. Ancak, çözümünüz çalışıyor, thx. –

+0

Yerel bir değişken adı olarak #xxx bence çiftlenebilir değil. Bunu yapmanın tek yolu ElementRef’dir, bu yüzden yönergeyi kullanmaktır. –

0

Çözüm

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> 

Yer yönergesi:

@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); 
     }); 
    } 
    } 
}