2015-12-04 22 views
11

Devo essere in grado di aggiungere & rimuovere al volo componenti angolari 2. Per farlo, sto usando loadIntoLocation e smaltire i metodi, simile al primo:Angolare 2 - Aggiunta/rimozione componenti al volo

Aggiunta di un componente (da un gestore di layout):

this.m_loader.loadIntoLocation(MyComponent, this.m_element, 'content').then(_componentRef => { 

    // Create the window and set its title: 
    var component: MyComponent = (_componentRef.instance); 
    component.ref = _componentRef; 

    // init the component content 
}); 

rimozione di un componente (dal componente):

this.ref.dispose(); 

e 'quasi funzionando: - se posso aggiungere un componente, e chiuderlo, funziona - se posso aggiungere diversi componenti, lavorano - ma se aggiungo componente a, quindi rimuoverlo, quindi aggiungere il componente B, sembra come angolare mi dà un riferimento ad A, e mantiene alcuni vecchi valori (i miei componenti sono trascinabili, e in questo caso la B verrà creata A era quando l'ho distrutto)

C'è un modo per rendere Angular distruggere i componenti correttamente, o almeno per costringerlo a crearne di nuovi?

+2

Riesci a riprodurre il comportamento in un plnkr? Ho [questo funziona] (http://plnkr.co/edit/z9xu3x2jVAEaoJq6TbRB?p=preview), ma non sono in grado (e non so davvero) come riprodurre il problema –

+1

Sì, ho biforcuto il tuo plunker: http://plnkr.co/edit/lvQfnLfTImcRqRcxJaXU?p=preview. Fai clic su "Aggiungi nuovo componente", trascinalo da qualche parte, fai clic su "Rimuovi", quindi fai nuovamente clic su "Aggiungi nuovo componente": il componente viene creato nella posizione appena rimossa. –

+0

Il problema sembra essere che angular2 di default riutilizza gli elementi DOM creati (preso da [questo commento] (https://github.com/angular/issues/4795#issuecomment-151688714)). Quindi se nel tuo bootstrap hai impostato 'provide (APP_VIEW_POOL_CAPACITY, {useValue: 0}' funzionerà bene. Ecco il [plnkr updated] (http://plnkr.co/edit/bqo9K5bru4CN1jZ4r9mt?p=preview). –

risposta

8

Come suggerito da Tim,

citando @ di tbosch elementi DOM comment

angolare riutilizza precedentemente creato per impostazione predefinita

Quindi, per evitare questo comportamento, tratto dal commento pure, è possibile utilizzare APP_VIEW_POOL_CAPACITY e assegnarlo come valore 0.

bootstrap(MyApp, [provide(APP_VIEW_POOL_CAPACITY, {useValue: 0})]) 

Aggiornamento

Nota che, dal momento beta.1 APP_VIEW_POOL_CAPACITY è stato rimosso dal #5993 e il DOM è stato ricreato in modo corretto.