【问题标题】:AngularJS + TypeScript: cannot inject $routeProviderAngularJS + TypeScript:无法注入 $routeProvider
【发布时间】:2013-08-08 16:29:20
【问题描述】:

我正在尝试将路由应用于我的基于 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”没有定义。那么,我该怎么做才能解决这个问题呢?

【问题讨论】:

  • : ng.IRouteProvider有什么用?
  • 这是 TypeScript:它只是一个类型声明。类型来自github.com/borisyankov/DefinitelyTyped。无论如何,代码被编译成 JS,这并没有实际效果。

标签: angularjs typescript


【解决方案1】:

更新答案: 就像我在下面的 cmets 中提到的那样

例如它在控制器中是无效的。仅供参考,您所说的“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

希望你和我一样喜欢 angular + typescript :)

【讨论】:

  • 谢谢巴萨拉特!但除了“魔术”字符串中的简单大小写更改可能以类似的方式对框架产生不利影响之外,这对我来说有点令人惊讶,这并不能解决我的问题。此外,所有其他服务都毫无问题地注入。无论如何,因为我是这里的菜鸟:),我通过 pascal-casing 或 camel-casing 测试了小提琴,得到了相同的结果(两者都有效),以及我自己的应用程序,这两种方法都不起作用。一旦你转向“真实世界”的场景,NG 的学习曲线看起来有点陡峭。还有其他想法吗?
  • PascalCase 在这个小提琴中不起作用:jsfiddle.net/basarat/ZBFQSjsfiddle.net/basarat/Up7re 比较注意,如果想在控制台上看到错误,您需要重新加载页面。
  • 所以即使你有&lt;div ng-app="MyApp"&gt;&lt;/div&gt;,你仍然需要angular.module("myApp", []);
  • 再次感谢,我没有完全理解您的评论。无论如何,这不是我的问题:我没有收到类似“MyApp not found”之类的错误:我收到这个奇怪的错误是因为后缀“Provider”被附加到 $routeProvider 被注入。我让我的应用程序名称完全小写,没有任何变化。如果我删除 $routeProvider 注入,一切正常,因为它在我添加它之前一直有效,即使使用 Pascal 大小写的名称。所以我不确定这里到底出了什么问题。
  • 当你删除 Provider 时,你会得到 $route,它与 routeProvider 不同。我不知道为什么它对你不起作用。我一直为我工作 + 你可以看到它在小提琴中工作。我确保小提琴也使用 1.0.7。抱歉,我认为您的代码没有其他问题:(
猜你喜欢
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2015-06-27
  • 2016-11-02
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多