fre*_*chx 3 angularjs typescript
使用以下模板配置AngularJS/Typescript Web应用程序并收到以下错误.
The following error is appearing when I run the application:
0x800a139e - JavaScript runtime error: [$injector:modulerr] Failed to instantiate module app due to:
Error: [$injector:nomod] Module 'app' 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.
Run Code Online (Sandbox Code Playgroud)
我检查过这个帖子并确保我确实有一个对angular-route.js的引用
app.ts - 更容易查看的版本+ index.html
/// <reference path="./typings/angularjs/angular.d.ts" />
'use strict';
// Create and register modules
var modules = ['app.controllers','app.directives', 'app.filters', 'app.services'];
modules.forEach((module) => angular.module(module, []));
angular.module('app', modules);
// Url routing
angular.module('app').config(['$routeProvider',
function routes($routeProvider: ng.IRouteProvider) {
$routeProvider
.when('/', {
templateUrl: 'views/MyView.html',
controller: 'app.controllers.MyController'
})
.otherwise({
redirectTo: '/'
});
}
]);
module app {
export module controllers {}
export module directives {}
export module filters {}
export module services {}
export interface IController {}
export interface IDirective {
restrict: string;
link($scope: ng.IScope, element: JQuery, attrs: ng.IAttributes): any;
}
export interface IFilter {
filter (input: any, ...args: any[]): any;
}
export interface IService {}
/**
* Register new controller.
*
* @param className
* @param services
*/
export function registerController (className: string, services = []) {
var controller = 'app.controllers.' + className;
services.push(app.controllers[className]);
angular.module('app.controllers').controller(controller, services);
}
/**
* Register new filter.
*
* @param className
* @param services
*/
export function registerFilter (className: string, services = []) {
var filter = className.toLowerCase();
services.push(() => (new app.filters[className]()).filter);
angular.module('app.filters').filter(filter, services);
}
/**
* Register new directive.
*
* @param className
* @param services
*/
export function registerDirective (className: string, services = []) {
var directive = className[0].toLowerCase() + className.slice(1);
services.push(() => new app.directives[className]());
angular.module('app.directives').directive(directive, services);
}
/**
* Register new service.
*
* @param className
* @param services
*/
export function registerService (className: string, services = []) {
var service = className[0].toLowerCase() + className.slice(1);
services.push(() => new app.services[className]());
angular.module('app.services').factory(service, services);
}
}
Run Code Online (Sandbox Code Playgroud)
我是一个TS/Angular新手,所以任何帮助将不胜感激.
谢谢
Sco*_*ott 14
您需要对该模板进行一些更改才能使其生效.
首先确保您有正确的参考.包括参考angular-route.d.ts
/// <reference path="./typings/angularjs/angular.d.ts" />
/// <reference path="./typings/angularjs/angular-route.d.ts" />
'use strict';
// Create and register modules
var modules = ['app.controllers','app.directives', 'app.filters', 'app.services'];
modules.forEach((module) => angular.module(module, []));
Run Code Online (Sandbox Code Playgroud)
要使用$routeProvider你必须ngRoute在你的模块中包含模块,但是因为我们不想用angular注册它,因为它已经存在,我们需要在此之后推送模块,如下所示:
// *** Push ngRoute or $routeProvider won't work ***
modules.push("ngRoute");
angular.module('app', modules);
Run Code Online (Sandbox Code Playgroud)
然后,你需要修复的类型$routeProvider,从ng.IRouteProvider到ng.route.IRouteProvider该定义是错误的.
// Url routing
angular.module('app').config(['$routeProvider',
function routes($routeProvider: ng.route.IRouteProvider) { // *** $routeProvider is typed with ng.route.IRouteProvider ***
$routeProvider
.when('/', {
templateUrl: 'views/MyView.html',
controller: 'app.controllers.MyController'
})
.otherwise({
redirectTo: '/'
});
}
]);
Run Code Online (Sandbox Code Playgroud)
下一个TypeScript不接受空模块.所以有export module controllers {}等等是没有意义的,因为TSC不会包含它们,并且它们将被定义为错误.除非您在应用程序中定义至少一个控制器,指令,过滤器和服务.但这可以通过简单地包括来解决null;
module app {
export module controllers { null; }
export module directives { null; }
export module filters { null; }
export module services { null; }
export interface IController {}
export interface IDirective {
restrict: string;
link($scope: ng.IScope, element: JQuery, attrs: ng.IAttributes): any;
}
export interface IFilter {
filter (input: any, ...args: any[]): any;
}
export interface IService {}
/**
* Register new controller.
*
* @param className
* @param services
*/
export function registerController (className: string, services = []) {
var controller = 'app.controllers.' + className;
services.push(app.controllers[className]);
angular.module('app.controllers').controller(controller, services);
}
/**
* Register new filter.
*
* @param className
* @param services
*/
export function registerFilter (className: string, services = []) {
var filter = className.toLowerCase();
services.push(() => (new app.filters[className]()).filter);
angular.module('app.filters').filter(filter, services);
}
/**
* Register new directive.
*
* @param className
* @param services
*/
export function registerDirective (className: string, services = []) {
var directive = className[0].toLowerCase() + className.slice(1);
services.push(() => new app.directives[className]());
angular.module('app.directives').directive(directive, services);
}
/**
* Register new service.
*
* @param className
* @param services
*/
export function registerService (className: string, services = []) {
var service = className[0].toLowerCase() + className.slice(1);
services.push(() => new app.services[className]());
angular.module('app.services').factory(service, services);
}
}
Run Code Online (Sandbox Code Playgroud)
现在应该可以使用,您可以注册您的控制器,过滤器,服务和指令.如:
module app.controllers
{
export class testCtrl implements IController
{
constructor()
{
console.log("Test Controller");
}
}
}
app.registerController('testCtrl');
Run Code Online (Sandbox Code Playgroud)
引用控制器或服务时使用全名.即:
<div ng-controller="app.controllers.testCtrl"></div>
Run Code Online (Sandbox Code Playgroud)
请记住在你的html angular-route.js之后引用angular.js.即:
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.12/angular-route.js"></script>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16622 次 |
| 最近记录: |