带有Angular 1.x中的原始JS和TS文件的混合Angular 1.x + Angular 6 App

时间:2018-08-26 14:39:30

标签: angularjs angular angular-ui-router angular-hybrid

当AngularJS文件既是JS又是TS时,我正在尝试构建一个混合应用程序。 我似乎无法向JS控制器添加路由。

我依靠以下example并执行以下操作:

const statesConfigBlock = ['$stateProvider', $stateProvider => {
  $stateProvider.state('main', {
    url: '/main',
    templateUrl: 'app/components/layout/mainView.html',
    controller: 'mainController as main'
  })
}];
appModuleAngularJS.config(statesConfigBlock);

当我有一个mainCtrl.js文件定义为:

var app = angular.module('myApp', []);

(function(app) {
  'use strict';

  app.controller('mainController', [
      function () {
        console.log("blah");

      }]);
})(app);

当我运行应用程序时,我得到:

  

名称为“ mainController”的控制器未注册

但是当我在控制台中运行时我确实看到了它:

angular.module('myApp')._invokeQueue.filter(function(el){
  return el[0] === "$controllerProvider";
}).map(function(el){
  return el[2]["0"];
});

1 个答案:

答案 0 :(得分:2)

好的,我想我设法做到了。可能不是最好的解决方案,但这是可行的。

首先,我创建了一个js文件,其中包含模块的声明:

appDependencies = [];
app = angular.module('myApp', appDependencies);

所有Angular 1.x控制器和服务都使用全局变量app,如下所示:

(function(app) {
  'use strict';

  app.controller('mainController', [
      function () {
        console.log("blah");

      }]);
})(app);

最后,Angular 1.x模块ts文件使用全局app并向其添加依赖项:

...

declare const app: any;
declare var appDependencies: any;

export const appModuleAngularJS = app;

angular.forEach([
  uiRouter, upgradeModule.name
], module => {
  appDependencies.push(module);
});

...

const statesConfigBlock = ['$stateProvider', $stateProvider => {
  $stateProvider.state('main', {
    url: '/main',
    templateUrl: 'app/components/layout/mainView.html',
    controller: 'mainController as main'
  })
}];
appModuleAngularJS.config(statesConfigBlock);

...

现在,index.html文件中js导入的顺序非常重要。 app减速文件应该首先出现,然后是所有Angular 1.x控制器和服务,然后是* .ts文件,这些文件已被转换为js文件。

该解决方案对我有用,但是我很高兴阅读更好的解决方案。

干杯!