2016-04-13 18 views
1

ng içeriğiyle alt bileşen özelliğini bağlamak istiyorum. Mümkün mü? <myComponent>123</myComponent> MyComponent.content için Örneğin Eğer değer 123 – değiştirebilirsiniz yani – bağlayıcı Eğer ihtiyaç 123.Ng içeriğe özellik nasıl bağlanır?

@Directive({ 
    selector: 'myComponent' 
}) 
class MyComponent { 
    content;   // should be set to 123 
} 

@Component({ 
    selector: 'app', 
    directives: [MyComponent], 
    template: ` 
    <myComponent>123</myComponent> 
    ` 
}) 
export class App { } 
+0

Bağlama, değerin (örneğinizdeki '123') değişebileceğini ve "içeriğin" özelliğinin değerinin herhangi bir yeni değerle otomatik olarak güncelleneceğini ima eder. Gerçekten bağlayıcı bir çözüm mü arıyorsunuz yoksa sadece metni veya HTML'yi (Günter'in cevabında gösterdiği gibi) çıkarmak istiyor musunuz? (Bağlamak istemiyorsanız lütfen başlığınızı yeniden yazın.) –

+0

Günter günümü kurtardı. Ama bağlayıcı çözüm de harika olurdu. – Dizzy

cevap

1
@Directive({ 
    selector: 'myComponent' 
}) 
class MyComponent { 
    content;   // should be set to 123 

    constructor(private elementRef:ElementRef) { 
    this.content = this.elementRef.nativeElement.innerHTML; 
    } 

    // to ensure bindings have been resolved 
    // see also 
    // https://angular.io/docs/ts/latest/guide/lifecycle-hooks.html#!#aftercontent 
    afterContentChecked() { 
    this.content = this.elementRef.nativeElement.innerHTML; 
    } 
} 

Plunker example

+0

Vay, ilginç! – Dizzy

+0

Çalışmıyor gibi görünüyor. –

+1

Cevabımı güncelledim. –

3

ayarlı ve siz yönergesi istediğiniz edilmelidir Herhangi bir değişiklik yapmadan, lifecycle hook ngAfterContentChecked():

@Directive({selector: 'myComponent'}) 
export class MyComponent { 
    content:string; 
    constructor(private _elRef: ElementRef) {} 
    ngAfterContentChecked() { 
    this.content = this._elRef.nativeElement.textContent; 
     // or maybe innerHTML, depending on what you want 
    console.log('new value:', this.content); 
    } 
} 

@Component({ 
    selector: 'my-app', 
    template: `<myComponent>{{number}}</myComponent> 
    <button (click)="number = number + 1">increment</button> 
    <button (click)="0">do nothing event</button> 
    <br>look at console log for directive binding updates`, 
    directives: [MyComponent] 
}) 
export class AppComponent { 
    number = 123; 
    constructor() { console.clear(); } 
} 

ngAfterContentChecked() her zaman değişimi saptama çalışır denir Plunker

not edin. Bu yüzden sadece gerçekten bağlayıcıya ihtiyacınız varsa bu yaklaşımı kullanın.

+0

Sorgu hakkında ne (TextDirective)? https://angular.io/docs/ts/latest/api/core/Query-var.html – Dizzy

+1

@Dizzy, Query(), ContentChild() ve ContentChildren() tarafından kullanımdan kaldırılmıştır. Her ikisi de bir yönerge olarak geçirilecek bir yönerge adı, bir bileşen adı veya bir yerel şablon değişken adı gerektirir. Örneğinizde örneğiniz yalnızca 123'ünüz olduğundan ve dolayısıyla hiçbir yönerge, bileşen veya yerel şablon değişkeni (yani, 123 'gibi bir şeyiniz yoktur) ContentChild'i kullanmadım. Örneğin, bir yerel şablon değişkeni kullandıysanız, bunu şu şekilde de yapabilirsiniz: 'ContentChild ('localTempVar') _elRef: ElementRef'. –

+0

Sorun InnerHTML'yi ayarladığımda, gölge dom yanlış oluyor ve alt bileşenleri çalışma zamanında oluşturmak için DynamicComponentLoader kullanamıyorum. Bu yüzden değiştirilmiş değeri geri almak için {{text}} kullanmalıyım. – Dizzy

İlgili konular