- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用标准的 ngUpgrade 模块将 AngularJS 应用程序升级到 Angular。我已将服务转换为 Angular,我需要将其降级以便在现有的 AngularJS 模块中使用它。我正在尝试像这样导入“downgradeInjectable”和 Angular 服务:
import { downgradeInjectable } from '@angular/upgrade/static';
import { MyService } from './app/my-service';
(function () {
var myCtrl = ['myService', function (myService) {
this.myService = myService;
...
}];
... stateConfig here
angular
.module('myModule')
.config(['$stateProvider', '$urlRouterProvider', stateConfig])
.controller('myController', myCtrl)
.factory('myService', downgradeInjectable(MyService))
})();
导入被 TypeScript 编译器识别为有效,并且编译一切正常,但是我现在在控制台中收到此错误:
Invalid System.register call. Anonymous System.register calls can only be made by modules loaded by SystemJS.import and not via script tags.
在转译后的代码中,SystemJS 会像这样处理导入:
System.register(["@angular/upgrade/static", "./app/my-service"], function (exports_1, context_1) {
"use strict";
...
我的其他 AngularJS 代码没有使用任何导入,这是我第一次在现有的 AngularJS 应用程序中引入“导入”。我需要做什么才能成功导入这些模块?我已经查看了类似的错误,但是没有任何内容可以帮助我或匹配这种特定情况。
更新:
我通过在我的主 html 文件中使用 SystemJS 导入主模块来加载应用程序,如下所示:
<script>
System.import('/assets/js/app/main.js').catch(function (err) { console.error(err); });
</script>
main.js 文件的原始 TypeScript 引导根 Angular 4 模块:
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
platformBrowserDynamic().bootstrapModule(AppModule);
... 根模块是这样的:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { UpgradeModule } from '@angular/upgrade/static';
import { AppComponent } from './app.component';
... other imports
@NgModule({
imports: [BrowserModule, UpgradeModule ],
declarations: [AppComponent],
entryComponents: [AppComponent],
providers: [ WindowRef, MyService]
})
export class AppModule {
constructor(private upgrade: UpgradeModule) {
}
ngDoBootstrap() {
var ngApp = <HTMLInputElement>document.getElementById('ngApp');
this.upgrade.bootstrap(document.documentElement, [ngApp.value]);
}
}
...然后在 Angular 的上下文中引导 AngularJS 应用程序。
我的 tsconfig.json:
{
"compilerOptions": {
"target": "es5",
"module": "system",
"moduleResolution": "node",
"sourceMap": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"lib": [ "es2015", "dom" ],
"noImplicitAny": false,
"suppressImplicitAnyIndexErrors": true,
"noStrictGenericChecks": true
},
"include": [ "**/*.ts" ],
"exclude": [
"node_modules"
]
}
进一步更新:
按照@Aluan Haddad 的建议,我现在尝试不导入像这样的根 AngularJS 声明:
main.ts
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';
**import root AngularJS declarations**
import '../app.js';
platformBrowserDynamic().bootstrapModule(AppModule);
app.js 中用于 AngularJS 声明的原始 app.ts 如下所示:
declare var angular: any;
(function () {
angular
.module('shared', ['shared.primaryNavigation', ...otherDependencies]);
angular
.module('shared.ui.router', ['ui.router']);
angular
.module('ngApp1', ['dependency']);
angular
.module('ngApp2', ['dependency']);
虽然这里没有导出任何东西,所以我不希望尝试的导入工作,老实说,我现在不知道模块加载是怎么回事,因为我只知道导入命名类并且 AngularJS 应用程序不使用任何导出!我现在在控制台中收到这些错误:
[$injector:nomod] Module 'shared' is not available! You either misspelled the module name or forgot to load it. If registering a module ensure that you specify the dependencies as the second argument.
那么我应该如何构建它才能成功加载应用程序?我的脚本包含如下所示:
<!-- Angular JS -->
<!-- Root Module Declarations -->
<!-- now commenting this out -->
<!--<script src="/assets/js/app.js"></script>-->
<!-- Shared Config -->
<script src="/assets/js/shared/shared.config.js"></script>
<!-- Shared Directives -->
<script src="/assets/js/shared/directives/myDirective1.js"></script>
<script src="/assets/js/shared/directives/myDirective2.js"></script>
<!-- Shared Components -->
<script src="/assets/js/shared/modules/myModule1.js"></script>
<script src="/assets/js/shared/modules/myModule2.js"></script>
<!-- Shared Services -->
<script src="/assets/js/shared/services/myService1.js"></script>
<script src="/assets/js/shared/services/myService2.js"></script>
最佳答案
您收到错误是因为顶级 import
或 export
将文件放入模块。
这导致 TypeScript 将其转译为这样。
匿名 System.register
模块必须由理解格式的加载器加载,通常是 SystemJS。
现在它是一个模块,像导入其他模块一样导入它
import './my-module';
并删除加载它的脚本标签。
这可以改进
import { downgradeInjectable } from '@angular/upgrade/static';
import { MyService } from './app/my-service';
class MyCtrl {
static $inject = ['myService'];
constructor(readonly myService) {...}
}
... stateConfig here
angular
.module('myModule')
.config(['$stateProvider', '$urlRouterProvider', stateConfig])
.controller('myController', MyCtrl)
.factory('myService', downgradeInjectable(MyService));
为了更详细地解释错误,SystemJS 还定义了一个named System.register
模块格式。这是 SystemJS Builder 中使用的(默认情况下)输出格式发射束。
关于javascript - 将模块导入 AngularJS 时出现 SystemJS 错误 - 匿名 System.register 调用只能由 SystemJS.import 加载的模块进行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48654650/
当我使用以下命令设置 jspm 安装时: jspm init 然后它只询问我初始配置: Would you like jspm to prefix the jspm package.json prop
我正在使用标准的 ngUpgrade 模块将 AngularJS 应用程序升级到 Angular。我已将服务转换为 Angular,我需要将其降级以便在现有的 AngularJS 模块中使用它。我正在
我正在 SystemJS+Typescript 环境中运行 Jasmine 测试(基本上 a plunk 这应该是 Angular 2 测试平台)。 Jasmine 有意用作全局库,而不是通过 Typ
我有一个没有安装 systemJS 的项目。 这是 package.json: { "name": "mytest", "version": "0.1.0", "private": tru
我使用 SystemJS 作为模块系统来编译 TypeScript 文件,但每当我在浏览器中加载页面时(通过 live-server ),我都会收到以下错误: ReferenceError: Sens
我正在尝试将我的应用程序与 webpack 捆绑在一起,然后将其包含在带有 SystemJS 的父应用程序中,我有点迷失了。 我已经创建了我的包,我已经尝试将它转换为 commonjs/umd/amd
我无法让 systemjs 工作,所以它解析节点模块。 我的 index.html 中有以下内容: System.import('blast/test') .the
我正在尝试遵循 Angular 2 设置指南,但遇到了问题。我正在使用 browsersync,我似乎无法弄清楚如何让这段代码工作。 ....... System.import('./a
有没有办法等到所有 System.register(从 ES6 转译而来)都被解析和加载? 这对于 e2e testing in Angular 特别有用和其他小东西。 最佳答案 System.imp
我有一个非常基本的 config.js文件按预期工作,只要它部署在根 URL 下。这是样本 config.js文件: System.config({ //use typescript for co
我想导入 Angular,实例化 AngularJS 模块,然后导入另一个需要实例化 Angular 的文件: import angular from 'angular'; var app = ang
在尝试让 Angular (1.x) 与 systemjs 一起工作时,我意识到目前没有能力(据我所知)自动将 $inject 插入到 Angular 组件中,这使得即使函数的参数被缩小器破坏,组件也
我正在使用 jspm 和 SystemJS 导入 ES2015 模块。 是否可以通过 System 对象或其他任何地方获取项目中所有导入模块的列表?我可以通过 System._loader.modul
我正在使用 JSPM、AngularJS、TypeScript、SystemJS 和 ES6 并且我的项目运行得很好......除非我尝试使用 momentJS。 这是我得到的错误: TypeErro
有人可以告诉我如何使用 SystemJS 将简单的 javascript 文件加载到浏览器中。 我正在尝试使用以下语法从我的node_modules文件夹加载jquery: packages: {
我在使用 systemjs-builder 构建我的应用程序时遇到问题。 这是我的应用程序的结构。 这是要构建的函数: var systemjsBuild = { map: {
有人让 SystemJS 和 SignalR 一起工作吗?我一直在尝试使用 SystemJS(来自 jspm)加载 SignalR,但无论我做什么,异步加载器总是存在竞争条件。大约一半的加载时间,Si
我正在使用 Angular2,并且我想包含 jQuery。 systemjs.config.js (function (global) { System.config({ paths: { '
我在所有项目中都使用 SystemJs 和 JSPM,感觉太棒了。使用前端库变得前所未有的简单,使用 JSPM 我可以通过几个简单的步骤来完成: 命令行:jspm 安装角度 index.ts|js:i
我无法使用 SystemJS (0.19.47) 正确加载 RxJS 基本上我有一些 TypeScript…… import {BehaviorSubject} from "rxjs"; let s
我是一名优秀的程序员,十分优秀!