AngularJS + TypeScript:无法注入$ routeProvider

时间:2013-08-07 10:27:29

标签: angularjs typescript

我正在尝试将路由应用到基于Typescript的Angular应用程序。该应用程序应该为$ routeProvider注入如下代码:

var app = angular.module("MyApp", ["ui.bootstrap"]);
// app.service's and controller's here...

app.config(["$routeProvider",
    function ($routeProvider: ng.IRouteProvider) {
        $routeProvider
            .when("/", {
                controller: MyApp.Controllers.ItemsController,
                templateUrl: "/Items.html"
            })
            // ... other routes ...
            .otherwise({
                redirectTo: "/"
            });
}]);

无论如何,当我启动应用程序时,我从angular获得异常,告诉我它无法找到名为 $ routeProviderProvider 的提供程序:

Error: Unknown provider: $routeProviderProvider <- $routeProvider at Error (<anonymous>)
    at http://.../Scripts/angular.js:2734:15
    at Object.getService [as get] (http://.../Scripts/angular.js:2862:39)
    at http://.../Scripts/angular.js:2739:45
    at getService (http://.../Scripts/angular.js:2862:39)
    at invoke (http://.../Scripts/angular.js:2880:13)
    at Object.instantiate (http://.../Scripts/angular.js:2914:23)
    at $get (http://.../Scripts/angular.js:4805:24)
    at $get.i (http://.../Scripts/angular.js:4384:17)
    at forEach (http://.../Scripts/angular.js:137:20) undefined angular.js:5754

通过查看角度源(1.0.7),我可以看出这是因为在创建 instanceInjector 的第2737行,其名称来自附加名为 providerSuffix ,其值为“Provider”,与请求的提供者名称(此处为“$ routeProvider”)。因此,这导致例外。然而,正确的名称应该是“$ routeProvider”;如果我在我的代码中将其更改为“$ route”,则此错误会按预期消失,因为现在内置名称为“$ routeProvider”;但我得到另一个例外,告诉我服务“$ route”没有定义。那么,我该怎么做才能解决这个问题呢?

1 个答案:

答案 0 :(得分:2)

更新回答: 就像我在下面的评论中提到的那样

  

e.g。它在控制器中无效。仅供参考您所谈论的“ProviderProvider”部分仅用于记录,而不是内部搜索依赖性的方式

在您的代码中找到:

export class MainController {
    static $inject = ["$scope", "$routeProvider"];

    constructor(private $scope: IMainScope,
        private $routeProvider: ng.IRouteProvider) {
    }
}

无法 在您的控制器中拥有routeProvider。您的app.config 是什么让您错误。将控制器更改为,错误消失:

export class MainController {
    static $inject = ["$scope"];

    constructor(private $scope: IMainScope) {
    }
}

此外,我建议在使用控制器时不要实现自己的范围。原因如下:http://www.youtube.com/watch?v=WdtVn_8K17E&feature=youtu.be&t=5m36s

希望你像我一样享受角度+打字稿:)