Нет провайдера для $scope! ошибка при использовании директивы angular 1 в приложении angular 2

У меня есть приложение angular 2, созданное с помощью angular-cli, и мне нужно использовать директиву angular 1 в одном из моих компонентов (чтобы повторно использовать его из другого приложения). Я выполнил шаги из:

https://angular.io/docs/ts/latest/guide/upgrade.html#!#using-angular-1-component-directives-from-angular-2-code

Но теперь я добрался до этой ошибки и не могу пройти мимо нее. Я использую angular2.0.2 (в прошлом мне удалось создать гибридное приложение с бета-версией, но это было приложение angular1, и я использовал компоненты angular 2 с функцией понижения версии адаптера).

В моем app.module.ts у меня есть:

import { UpgradeAdapter } from '@angular/upgrade';
const upgradeAdapter = new UpgradeAdapter(forwardRef(() => AppModule));

const HeroDetail = upgradeAdapter.upgradeNg1Component('heroDetail');

@NgModule({
    imports:      [
        BrowserModule,
        ...
    ],
    declarations: [
      ...       
     HeroDetail
     ]
})
export class AppModule { }

и мой hero-detail.component.ts выглядит так:

export const heroDetail = {
  templateUrl: 'hero-detail.html',
  controller: function() {
  }
};

и мой hero-detail.html выглядит так:

   <h2>Windstorm details!</h2>

Я пытаюсь использовать директиву в другом компоненте angular 2, просто добавляя в шаблон:

Когда я запускаю ng serve, приложение компилируется нормально, но когда я пытаюсь загрузить страницу, я получаю указанную ошибку.

Любые предложения о том, как я могу двигаться вперед с этим?


person raluca    schedule 26.10.2016    source источник
comment
Есть ли прогресс в этом? Я испытываю ту же проблему.   -  person vangorra    schedule 08.12.2016
comment
Фактически мы перешли на полный angular 2 и перенесли все наши старые компоненты, так как это был единственно возможный способ.   -  person raluca    schedule 11.04.2018
comment
Проверьте обходной путь здесь, вам нужно что-то вроде этого @NgModule({ ... провайдеры: [{provide: '$scope', useExisting: '$rootScope'}], } экспорт класса AppModule { ... }   -  person Chen Dachao    schedule 20.02.2019


Ответы (1)


Кажется, у вас неправильная логика начальной загрузки.

На самом деле это не совсем очевидно, убедитесь, что:

  • вы не загружаете какой-либо компонент ng2 с помощью @NgModule({bootstrap:[ ... ]}). Вместо этого у вас должен быть пустой метод ngDoBootstrap() { } в вашем основном модуле.
  • корневым шаблоном является шаблон ng1. т.е. в вашем index.html у вас должны быть только компоненты ng1 или компоненты ng2 пониженной версии. У вас может быть компонент ng2 в качестве корневого, но сначала вам нужно понизить его версию.

Официальное руководство по обновлению содержит пример структуры DOM:

введите здесь описание изображения

... что гарантирует, что у инжекторов ng2 есть все необходимые поставщики из ng1.

person Demchenko Anton    schedule 03.02.2017