Внедрить услугу angularjs в Angular
Я пытаюсь использовать $log
Служба в угловых 2, в соответствии с тем, что я прочитал, вам нужно следующие шаги:
- Создайте модуль, содержащий сервис, который вы хотите внедрить.
- Вызвать метод UpgradeAdapter upgradeNg1Provider.
Итак, я сделал следующее
var initInjector = angular.injector(['ng']);
var $log = initInjector.get('$log');
angular.module('Services1', [])
.service('$log', [$log]);
upgradeAdapter.upgradeNg1Provider('$log');
Затем я создаю угловой компонент 2 следующим образом
@Component({ selector: "ion-app", template:"<p>Test</p>" })
@Injectable()
export class HelloIonicPage {
message: string;
constructor( @Inject('$log') $log) {
this.message = "Hi";
}
}
Но когда я запускаю приложение, оно дает мне следующую ошибку:
ОРИГИНАЛЬНОЕ ИСКЛЮЧЕНИЕ: Нет провайдера для $ log!
Также я пытался bootstrap
с помощью upgradeAdapter
:
upgradeAdapter.bootstrap(document.documentElement, ['Services1'])
Но это тоже не сработало. Пожалуйста, обратите внимание, что я использую Ionic 2 Framework и приведенный выше код написан внутри
this.platform.ready().then(() => {
//The code is going here
});
2 ответа
Вам необходимо зарегистрировать услугу в качестве поставщика. Вот как я вводю angular1 $state в приложение angular 2:
@NgModule({
providers: [
{
provide: '$state',
useFactory: ($injector: any) => $injector.get('$state'),
deps: ['$injector']
}
]
})
а затем в месте инъекции:
@Injectable()
export class RestService {
constructor(@Inject('$state') $state: any) {
$state.go('...');
}
}
Ответ от @Liovareg работает намного лучше, чем официальная документация. Мой сервис Angular (1.5.x) находился в файле JS, и это был@Inject
что мне не хватало в Angular 13 (и отличается от официальных документов).
Угловой JS:
(function () {
angular
.module('common')
.service('appContext', appContext);
appContext.$inject = ['$cookies', 'moment', '$location', 'userCacheFactory', 'urlHrefCacheFactory', 'lock'];
function appContext($cookies, moment, $location, userCacheFactory, urlHrefCacheFactory, lock) {
...
function renewSession() {
...
}
...
return {
renewSession: renewSession,
...
};
};
})();
ajs-upgraded-providers.ts (находится на том же уровне, что и app.module.ts):
// @ts-ignore
import { appContext } from '../../../app/common/appContext';
export function appContextServiceFactory(injector: any) { // eslint-disable-line @typescript-eslint/no-explicit-any
return injector.get('appContext');
}
export const ajsAppContextServiceProvider: any = { // eslint-disable-line @typescript-eslint/no-explicit-any
deps: ['$injector'],
provide: 'appContext',
useFactory: appContextServiceFactory
};
app.module.ts:
import { ajsAppContextServiceProvider } from './ajs-upgraded-providers';
...
@NgModule({
...
providers: [
...,
ajsAppContextServiceProvider
]
})
...
Угловой 13 (foo.service.ts):
...
@Injectable({
providedIn: 'root'
})
export class SessionTimeoutService {
...
public constructor(
@Inject('appContext') private ajsAppContextService: any, // eslint-disable-line @typescript-eslint/no-explicit-any
...
)
...
public someMethod(): void {
this.ajsAppContextService.renewSession();
}
...
}