Как использовать angular 2 upgradeAdapter.upgradeNg1Component?

Я почти уверен, что мне здесь не хватает чего-то фундаментального.

Я начал использовать адаптер обновления ng2 до RC5, чтобы начать перенос приложения ng1 на ng2. А раньше, когда вы объявляли директивы, используемые компонентом, непосредственно в компоненте, все подключалось правильно и имело смысл.

Но теперь я пытаюсь перенести свое гибридное приложение на Angular 2 Final, и вся эта вещь NgModule сбивает с толку гибридное приложение, когда дело доходит до зависимостей.

Чтобы создать адаптер обновления, мне нужно передать ему модуль Ng2, который я хочу использовать в гибридном приложении. Это нормально. Но это означает, что модуль Ng2 должен быть полностью определен ДО создания адаптера обновления, верно? Если это правда, то как мне использовать еще не созданный адаптер обновления для обновления компонентов ng1 для использования в модуле ng2 (который необходимо создать ДО создания адаптера)???

К вашему сведению, если пойти другим путем, это нормально: у меня есть модуль машинописного текста, который понижает версию всех компонентов ng2 верхнего уровня, которые мне нужно использовать в ng1 (в конфигурации ui-router), и этот модуль машинописного текста загружается после того, как оба адаптер обновления и модуль Ng2, содержащий мои компоненты для понижения версии.

Итак, что мне не хватает? Как использовать функциональность updateNg1Component адаптера обновления?

Без этой функции мне приходится начинать с самых внешних компонентов и продвигаться внутрь. И это прекрасно работает, за исключением того, что есть некоторые общие компоненты, которые используются повсюду, и я бы предпочел не конвертировать их сначала в ng2.


person snorkpete    schedule 07.10.2016    source источник
comment
Можешь подробно объяснить, какие у тебя проблемы с этим «ДО»? Пример не помешал бы. Руководство достаточно ясно описывает предлагаемые использования, и, очевидно, временных парадоксов не бывает.   -  person Estus Flask    schedule 09.10.2016
comment
Я пытаюсь уложить в голове ментальный модуль. Вам нужно предоставить адаптеру обновления модуль ng2 в его конструкторе. Но чтобы использовать обновленные компоненты ng1, их необходимо объявить в том же модуле ng2, который должен быть определен перед адаптером. В моем конкретном примере мой адаптер, который находится в отдельном модуле es2015, не создается из-за этой циклической зависимости. (Когда я пытаюсь импортировать адаптер в модуль es2015, который содержит логику обновления компонента ng1, вместо этого я получаю «неопределенное»)   -  person snorkpete    schedule 11.10.2016
comment
У меня такой же спотыкается, и это действительно странно.   -  person Mihail Zheludev    schedule 22.10.2016


Ответы (1)


Я наткнулся на ту же проблему и нашел решение, просмотрев исходный код Angular. Хитрость заключается в том, чтобы использовать forwardRef() при создании UpgradeAdapter:

import {NgModule, forwardRef} from '@angular/core';
import {UpgradeAdapter} from '@angular/upgrade';

const adapter = new UpgradeAdapter(forwardRef(() => AppModule));

@NgModule({
    declarations: [
         adapter.upgradeNg1Component('my-component');
    ]
})
class AppModule {
}

// now call adapter.bootstrap()
person urish    schedule 18.10.2016
comment
Да, это работает, но вы должны экспортировать адаптер, чтобы иметь возможность обновления/отката во внешних компонентах. - person Mihail Zheludev; 22.10.2016