Angular NgUpgrade 将 AngularJS 服务注入 Angular 服务;获取:未处理的承诺拒绝:无法读取未定义的属性“get”;区:

2023-12-24

我在这里看到很多类似的问题,但尚未找到有效的解决方案。我认为正在发生的事情是,因为我们的 Ng2App 首先被引导,所以它还没有对 $injector 的引用,所以当我尝试在我的提供程序声明中使用它时(deps: ['$injector']),它没有不存在。

非常奇怪的是,我可以在 Angular 组件中使用此服务,但由于某种原因无法在 Angular 服务中使用它。

app.js

import UserService from './user.service';
angular.module('app', [])
  .service('UserService', UserService)
  .config(/* config */)
  .run(/* run */);

 import './ng2app.module';

ng2app.module.ts:

import { BrowserModule } from '@angular/platform-browser';
import { UpgradeModule } from '@angular/upgrade/static';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
@NgModule({
  imports: [
    BrowserModule,
    UpgradeModule,
  ], 
  declarations: [],
  entryComponents: [],
  providers: [
    // angularJS service:
    { 
     provide: 'UserService',
     useFactory: (i: any) => i.get('UserService'), // <---- this is the line all the errors point to.
     deps: ['$injector']
    },
  ]
})
export default class Ng2AppModule {
  constructor(){}
}


platformBrowserDynamic()
  .bootstrapModule(Ng2AppModule)
  .then(platformRef => {
    const upgrade = platformRef.injector.get(UpgradeModule) as UpgradeModule;
    upgrade.bootstrap(document.documentElement, ['app'], {strictDi: true});
});

后来......在服务中(失败):

import {Injectable, Inject} from "@angular/core";
import UserService from 'app/login/user.service';

@Injectable()
export class AnAngularService{
  constructor(
    // causes the error if I uncomment it wtf: <--------------
    // @Inject('UserService') private userService: UserService
  ){}
}

后来......在一个组件中(工作正常):

import { Component } from '@angular/core';
import {Inject} from "@angular/core";
import UserService from 'app/login/user.service';
import template from 'tmpl.html';

@Component({
  selector: 'an-angular-component',
  template,
})
export class AnAngularComponent{
  constructor(

    @Inject('UserService') private userService: UserService
  ){
    console.log(userService) // works just fine. wtf <--------------
  }
}

有谁知道为什么会发生这种情况以及如何解决它?

这个问题几乎完全相同,但由于某种原因它不起作用 https://stackoverflow.com/questions/43870336/injecting-angular-1-service-into-angular-4?rq=1

AngularJS 版本:1.5.8
角度/核心等版本:4.2.4

这是我在 Angular 存储库中打开的 Github 问题的链接 https://github.com/angular/angular/issues/18712

堆栈跟踪:

zone.js:522 Unhandled Promise rejection: Cannot read property 'get' of undefined ; Zone: <root> ; Task: Promise.then ; Value: TypeError: Cannot read property 'get' of undefined
    at useFactory (ng2app.module.ts:114)
    at _callFactory (core.es5.js:9604)
    at _createProviderInstance$1 (core.es5.js:9547)
    at initNgModule (core.es5.js:9498)
    at new NgModuleRef_ (core.es5.js:10606)
    at createNgModuleRef (core.es5.js:10590)
    at Object.debugCreateNgModuleRef [as createNgModuleRef] (core.es5.js:12874)
    at NgModuleFactory_.create (core.es5.js:13869)
    at core.es5.js:4556
    at ZoneDelegate.invoke (zone.js:334)
    at Object.onInvoke (core.es5.js:3933)
    at ZoneDelegate.invoke (zone.js:333)
    at Zone.run (zone.js:126)
    at NgZone.run (core.es5.js:3801)
    at PlatformRef_._bootstrapModuleFactoryWithZone (core.es5.js:4554)
    at core.es5.js:4596
    at ZoneDelegate.invoke (zone.js:334)
    at Zone.run (zone.js:126)
    at zone.js:713
    at ZoneDelegate.invokeTask (zone.js:367)
    at Zone.runTask (zone.js:166)
    at drainMicroTaskQueue (zone.js:546)
    at <anonymous> TypeError: Cannot read property 'get' of undefined
    at useFactory (http://localhost:9000/app.bundle.js:4404:52)
    at _callFactory (http://localhost:9000/vendor.bundle.js:10600:26)
    at _createProviderInstance$1 (http://localhost:9000/vendor.bundle.js:10543:26)
    at initNgModule (http://localhost:9000/vendor.bundle.js:10494:13)
    at new NgModuleRef_ (http://localhost:9000/vendor.bundle.js:11602:9)
    at createNgModuleRef (http://localhost:9000/vendor.bundle.js:11586:12)
    at Object.debugCreateNgModuleRef [as createNgModuleRef] (http://localhost:9000/vendor.bundle.js:13870:12)
    at NgModuleFactory_.create (http://localhost:9000/vendor.bundle.js:14865:25)
    at http://localhost:9000/vendor.bundle.js:5552:61
    at ZoneDelegate.invoke (http://localhost:9000/vendor.bundle.js:289131:26)
    at Object.onInvoke (http://localhost:9000/vendor.bundle.js:4929:37)
    at ZoneDelegate.invoke (http://localhost:9000/vendor.bundle.js:289130:32)
    at Zone.run (http://localhost:9000/vendor.bundle.js:288923:43)
    at NgZone.run (http://localhost:9000/vendor.bundle.js:4797:62)
    at PlatformRef_._bootstrapModuleFactoryWithZone (http://localhost:9000/vendor.bundle.js:5550:23)
    at http://localhost:9000/vendor.bundle.js:5592:59
    at ZoneDelegate.invoke (http://localhost:9000/vendor.bundle.js:289131:26)
    at Zone.run (http://localhost:9000/vendor.bundle.js:288923:43)
    at http://localhost:9000/vendor.bundle.js:289510:57
    at ZoneDelegate.invokeTask (http://localhost:9000/vendor.bundle.js:289164:31)
    at Zone.runTask (http://localhost:9000/vendor.bundle.js:288963:47)
    at drainMicroTaskQueue (http://localhost:9000/vendor.bundle.js:289343:35)
    at <anonymous>
consoleError @ zone.js:522
handleUnhandledRejection @ zone.js:527
_loop_1 @ zone.js:562
drainMicroTaskQueue @ zone.js:566
Promise resolved (async)
scheduleQueueDrain @ zone.js:505
scheduleMicroTask @ zone.js:513
ZoneDelegate.scheduleTask @ zone.js:356
Zone.scheduleTask @ zone.js:196
Zone.scheduleMicroTask @ zone.js:207
scheduleResolveOrReject @ zone.js:711
ZoneAwarePromise.then @ zone.js:800
PlatformRef_._bootstrapModuleWithZone @ core.es5.js:4596
PlatformRef_.bootstrapModule @ core.es5.js:4581
(anonymous) @ ng2app.module.ts:140
__webpack_require__ @ bootstrap 2f644bad14cb0bb324ab:691
fn @ bootstrap 2f644bad14cb0bb324ab:110
(anonymous) @ app.js:116
__webpack_require__ @ bootstrap 2f644bad14cb0bb324ab:691
fn @ bootstrap 2f644bad14cb0bb324ab:110
(anonymous) @ util (ignored):1
__webpack_require__ @ bootstrap 2f644bad14cb0bb324ab:691
webpackJsonpCallback @ bootstrap 2f644bad14cb0bb324ab:23
(anonymous) @ app.bundle.js:1

看来是时间安排的问题@NgModule({ providers: [] })upgrade.bootstrap解决。

在这里你需要$injector但在请求时并未注入。

In the docs https://angular.io/guide/upgrade它说你应该使用ngDoBootstrap hook.

export function userServiceFactory(i: any) {
  return i.get('UserService');
}

export const userServiceProvider = {
  provide: 'UserService',
  useFactory: userServiceFactory,
  deps: ['$injector']
};

import { BrowserModule } from '@angular/platform-browser';
import { UpgradeModule } from '@angular/upgrade/static';
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
@NgModule({
  imports: [
    BrowserModule,
    UpgradeModule,
  ], 
  declarations: [],
  entryComponents: [],
  providers: [
     userServiceProvider
  ]
}) 


export default class Ng2AppModule {

   constructor(private upgrade: UpgradeModule) { }

   ngDoBootstrap() {
     this.upgrade.bootstrap(document.body, ['app'], { strictDi: true });
   }
}

platformBrowserDynamic().bootstrapModule(Ng2AppModule);

由安德鲁·卢林为后代编辑不幸的是,即使这正是角度文档中所写的,这也不起作用。这里原来的答案是:

import { forwardRef } from '@angular/core';

useFactory: (forwardRef(() => '$injector')i: any) => i.get('UserService')

这似乎比这个更接近答案。这也不起作用——但这似乎是因为 TypeScript 认为语法不正确。

Update:

我们如此着迷于useFactory我们没有看到修复只是添加forwardRef到服务。

@Injectable()
export class AnAngularService{
  constructor(@Inject(forwardRef(() => 'UserService')) private userService: UserService
  ){}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular NgUpgrade 将 AngularJS 服务注入 Angular 服务;获取:未处理的承诺拒绝:无法读取未定义的属性“get”;区: 的相关文章

随机推荐

  • DOCX 和 PDF 的版本控制?

    我一直在玩git and hg最近 我突然想到这种东西对于文档来说非常有用 我有一个在 DOCX 中编辑并导出为 PDF 的文档 我尝试同时使用git and hg对它进行版本控制 结果是hg您最终只跟踪二进制文件 并且比较没有意义 虽然与
  • jquery 可拖动可放置 删除已放置

    如何从购物车中删除该商品 当然 您希望能够将项目拖放回去 function catalog accordion catalog li draggable appendTo body helper clone cart ol droppabl
  • ChromeCast 的 Java API

    有没有办法使用标准 桌面 Java 连接到 ChromeCast 我正在寻找一种自动化测试的方法 并希望我们的 CC s 自动播放视频 到目前为止我已经找到这个项目 https github com vitalidze chromecast
  • 需要两个键来获取唯一值的集合

    我想知道是否有人知道存储数据的好方法 以便使用两个键对其进行索引 基本上 我需要类似表格的东西 顶行是 key1 左列是 key2 字母是从索引返回的值 1 2 3 4 1 A B C D 2 B E F G 3 C F H I 4 D G
  • 使用 python 修剪网络摄像头的实时视频(从中删除帧)

    我有一个捕获视频流的网络摄像头 30 秒后 我想从开始处删除 1 秒的视频 并继续捕获视频流等等 简而言之 我只想保存直播视频的最新30秒 OpenCV不提供视频处理 ffmpeg 修剪视频但创建一个新的输出文件 我不想保留副本 Creat
  • 由于本地存储库问题,Mac 版 GitHub 在打开时崩溃

    我试图弄清楚为什么当我选择本地存储库时 我的 GitHub for Mac 在启动时崩溃 我从克隆的文件夹中添加了这个本地存储库 不幸的是 我正在使用 git 命令行 我一定做了一些事情来破坏本地 存储库 现在 我的 GitHub for
  • ASP.Net - 使用 Repeater 在客户端重复输入框

    我对在应用程序中创建用户配置文件有以下要求 用户应该能够在其个人资料中输入多个电话号码 电子邮件地址 屏幕看起来有点像这样 默认情况下 页面加载时会显示电话和电子邮件的单个文本框 用户可以单击 按钮添加其他号码 地址 单击 按钮后 我们需要
  • Azure Functions Core Tools 无法安装绑定所需的扩展

    我正在尝试在本地运行 Azure 函数 JavaScript 但失败了func start出现以下错误 AddConfig 绑定类型 表 未注册 请确保类型正确并安装绑定扩展 请注意 我已经成功安装了先决条件 这些先决条件在当时或写作时是
  • 当我在 C++ 中使用 auto bi = 123456789 时,它总是分配为 int 吗?

    如果我想让 bi 成为long int 不可能使用 auto 因为它总是分配为 int 吗 一些选项 auto bi 123456789 const char auto bi2 12345 int auto bi3 123456789 in
  • 使用 Windows API 写入和读取 Windows 注册表

    我正在尝试从 Windows 注册表中写入读取内容 写作 std string path c LPCTSTR str data TEXT path c str auto size static cast
  • 始终保持 git 镜像同步

    我有几个使用 Drupal 的网站 我有几个服务器 live dev1 dev2 Drupal 的代码库存储库很大 112Mb 所以我热衷于充分利用 git 的硬链接功能 这样每次我添加一个站点时都不会重复它 因此 比如说 我的实时服务器有
  • Symfony 2 / Doctrine 2:获取对 PersistentCollection 的更改

    我正在构建一个应用程序 用户可以在其中编辑一些数据 然后会看到一个屏幕 他可以在其中确认 并评论 他的编辑 在确认表单中 我显示对实体所做的更改 这适用于 正常 字段 以下是一些用于检查单个字段的代码 create form bind fo
  • 正则表达式:匹配Python中的句号和一个单词

    我是正则表达式的新手 我希望编写一个与 匹配的正则表达式后跟一个空格 后跟一个单词 不包含空格 例如 在字符串 The sound of cracking Splintering A shape displayed inice 中 正则表达
  • 操作错误:没有这样的模块:fts4

    您好 我尝试运行模糊匹配器代码 并弹出以下错误 OperationalError no such module fts4 有什么建议么 提前致谢 编辑 我已经尝试从网站下载 sqlite zip 并将其保存在 DLL 文件中 但它仍然不起作
  • xsl:for-each 只返回第一个节点

    我在使用 XSLT 时遇到了一些麻烦 我想从中输出每个子属性
  • Beautiful Soup:从html获取图片大小

    我想使用 Beautifulsoup 提取图片的宽度和高度 所有图片都有相同的代码格式 img src http somelink com somepic jpg width 200 height 100 我可以轻松提取链接 for pic
  • 编译错误,包 javax.ws.rs 不存在,依赖关系未从 maven 解析

    我在pom文件中提到了依赖库 库系统路径也存在 但是在使用maven clean install e X编译期间 它抛出错误说包不存在 INFO ERROR COMPILATION ERROR INFO ERROR C Users gopc
  • MATLAB 内存不足,但不应如此

    我正在尝试申请PCA https en wikipedia org wiki Principal component analysis在我的数据上使用princomp x https www mathworks com help stats
  • 图像最大宽度在 Firefox 中不起作用

    这里 我使用的是最新的bootstrap v3 2 0 当我有电话时display table cell div 块中的 CSS 所以 不会工作max width 100 Firefox 中 it div 块内部图像的 CSS 它在其他浏览
  • Angular NgUpgrade 将 AngularJS 服务注入 Angular 服务;获取:未处理的承诺拒绝:无法读取未定义的属性“get”;区:

    我在这里看到很多类似的问题 但尚未找到有效的解决方案 我认为正在发生的事情是 因为我们的 Ng2App 首先被引导 所以它还没有对 injector 的引用 所以当我尝试在我的提供程序声明中使用它时 deps injector 它没有不存在