angularjs - Enkelt eksempel som bruker Angular 1 med TypeScript og SystemJS


Jeg har prøvd å konvertere en TypeScript Angular 1-applikasjon til å bruke ES6-stil modulinnføringer.

Å slutte å bruke namespace og bruke import-nøkkelordet for å hente inn moduler. f.eks.

import * as angular from "angular";
import * as angularroute from "angular-route";

Men jeg har støtt på noen problemer. Jeg får en feil fra angular:
Ufanget (i løfte) feil: (SystemJS) [$injector:modulerr] Kunne ikke instansiere modul testApp på grunn av:
Feil: [$injector:modulerr] Kunne ikke instansiere modul ngRoute på grunn av:
Feil: [$injector:nomod] Modulen 'ngRoute' er ikke tilgjengelig! Enten har du stavet modulnavnet feil eller glemt å laste det. Hvis du registrerer en modul, sørg for at du spesifiserer avhengighetene som det andre argumentet

For å illustrere problemet har jeg laget to applikasjoner på GitHub:
1) Angular1WithNamespaces - Original appen som jeg vil konvertere.
2) Angular1WithSystemJS - Min konvertering, som har et problem.

Nedenfor er utdrag fra Angular1WithSystemJS-eksemplet som har problemet.

index.html

<!DOCTYPE html>
<html lang="en" ng-app="testApp">
<head><base href="/"></head>
<body >
    <ng-view></ng-view>
    <script src="node_modules/systemjs/dist/system.js"></script>
    <script src="configs/systemjs.config.js"></script>
    <script>
      System.import('app/boot');
    </script>
</body>
</html>

systemjs.config.js

System.config({
  defaultJSExtensions: true,

  paths: {
    "npm:*": "../node_modules/*"
  },
  // map tells the System loader where to look for things
  map: {
    "angular": "npm:angular/angular.js",
    "angular-route": "npm:angular-route/angular-route.js",
  },
  meta: {
    'angular': {
      format: 'global',
    },
    'angular-route': {
      format: 'global',
    },
  }
});

boot.ts

/// <reference path="../typings/tsd.d.ts" />
import * as angular from "angular";
import * as angularroute from "angular-route";

let main = angular.module("testApp", ["ngRoute"]);

main.config(routeConfig)

routeConfig.$inject = ["$routeProvider"];
function routeConfig($routeProvider: angular.route.IRouteProvider): void {
    $routeProvider
            .when("/dashboard", {
                templateUrl: "/app/dashboard.html",
            })
            .otherwise("/dashboard");
}

All hjelp med å få dette til å fungere vil bli svært satt pris på.

Svar #1

Jeg har funnet en løsning ved å lese et blogginnlegg fra https://legacy-to-the-edge.com/2015/01/21/using-es6-with-your-angularjs-project/

Det var relatert til hvordan jeg gjorde importen for angular-route. Til slutt var det bare en endring på én linje.
I boot.ts endret jeg importsetningen fra:

import * as angularroute from "angular-route";

til :

import "angular-route";

Jeg kan bare anta at sistnevnte også vil kjøre skript i modul-filen.
I henhold til spesifikasjonen om import på developer.mozilla.org

import "my-module";
Importer et helt modul kun for side-effekter, uten å importere noen bindings.

Den faste versjonen er på GitHub Angular1WithSystemJSFixed