2015-12-04 7 views
11

Мне нужно добавить & удалить угловые 2 компоненты на лету. Для этого я использую loadIntoLocation и распоряжаться методами, как это:Угловой 2 - Добавление/удаление компонентов на лету

Добавление компонента (от менеджера компоновки):

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

Удаление компонента (от компонента):

this.ref.dispose(); 

это почти работает: - если добавить компонент, и закрыть его, он работает - если добавить несколько компонентов, они работают - но если добавить компонент а, затем удалить его, а затем добавить компонент в, это похоже на Угловое дает мне ссылку на A и сохраняет некоторые старые значения (мои компоненты перетаскиваются, и в этом случае B будет создан A был, когда я его уничтожил)

Есть ли способ сделать угловые уничтожить компоненты правильно или по крайней мере, заставить его создавать свежие?

+2

Можете ли вы воспроизвести поведение в plnkr? У меня есть [этот рабочий] (http://plnkr.co/edit/z9xu3x2jVAEaoJq6TbRB?p=preview), но я не могу (и не знаю, действительно), как воспроизвести вашу проблему. –

+1

Да, я разветвлен ваш плукер: http://plnkr.co/edit/lvQfnLfTImcRqRcxJaXU?p=preview. Нажмите «Добавить новый компонент», перетащите его где-нибудь, нажмите «Удалить», затем снова нажмите «Добавить новый компонент»: компонент создается только что удаленным местом. –

+0

Проблема заключается в том, что angular2 по умолчанию повторно использует созданные элементы DOM (взял его из [этого комментария] (https://github.com/angular/angular/issues/4795#issuecomment-151688714)). Поэтому, если в вашем бутстрапе вы установите 'обеспечить (APP_VIEW_POOL_CAPACITY, {useValue: 0}', он будет работать красиво. Вот [plnkr updated] (http://plnkr.co/edit/bqo9K5bru4CN1jZ4r9mt?p=preview). –

ответ

8

Как предложил Тим,

Цитирование @ tbosch в comment

Угловая повторное использование ранее созданных элементов DOM по умолчанию

Таким образом, чтобы избежать этого, взятая из комментария, а также, вы можете использовать APP_VIEW_POOL_CAPACITY и назначить его 0 в качестве значения.

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

Обновление

Обратите внимание, что поскольку beta.1 APP_VIEW_POOL_CAPACITY удаляют #5993 и DOM, в настоящее время воссозданы правильно.

Смежные вопросы