angularjs - AngularJS、Typescript 和 Oclazyload 无法识别范围
问题描述
我正在将我现有的AngularJS
应用程序从 ( AngularJS
++ ) 更改为( ES5
++ )Webpack
AngularJS
Typescript
Webpack
这是我的模块实现之一:
登录控制器.ts
import {ILoginScope} from "./login.scope";
import {LoginViewModel} from "../../../view-models/user/login.view-model";
export class LoginController implements ng.IController{
//#region Properties
public email: string = '123456';
//#endregion
//#region Constructor
/*
* Initialize controller with injectors.
* */
public constructor(public $scope: ILoginScope){
this.$scope.loginModel = new LoginViewModel();
this.$scope.loginModel.email = '123';
this.$scope.hasEmail = this.hasEmail;
}
//#endregion
//#region Methods
//#endregion
//#region Events
public clickLogin(): void {
console.log('Hello world');
}
public hasEmail(): boolean{
let loginModel = this.$scope.loginModel;
if (!loginModel || !loginModel.email)
return false;
return true;
}
//#endregion
}
login.scope.ts
import {LoginViewModel} from "../../../view-models/user/login.view-model";
export interface ILoginScope extends ng.IScope {
//#region Properties
/*
* Login information.
* */
loginModel: LoginViewModel;
//#endregion
//#region Methods
/*
* Called when login is clicked.
* */
clickLogin: Function;
hasEmail: () => boolean;
//#endregion
}
登录模块.ts
import {StateProvider} from "@uirouter/angularjs";
import {UrlStatesConstant} from "../../../constants/url-states.constant";
import {module} from 'angular';
export class LoginModule {
//#region Constructors
public constructor(private $stateProvider: StateProvider) {
$stateProvider
.state(UrlStatesConstant.LoginStateName, {
url: UrlStatesConstant.LoginStateUrl,
controller: 'loginController',
templateProvider: ['$q', ($q) => {
// We have to inject $q service manually due to some reasons that ng-annotate cannot add $q service in production mode.
return $q((resolve) => {
// lazy load the view
require.ensure([], () => resolve(require('./login.html')));
});
}],
parent: UrlStatesConstant.AuthorizeLayoutName,
resolve: {
/*
* Load login controller.
* */
loadLoginController: ($q, $ocLazyLoad) => {
return $q((resolve) => {
require.ensure([], (require) => {
// load only controller module
let ngModule = module('account.login', []);
// Import controller file.
const {LoginController} = require("./login.controller");
ngModule.controller('loginController', LoginController);
$ocLazyLoad.load({name: ngModule.name});
resolve(ngModule.controller);
})
});
}
}
});
}
//#endregion
}
这就是我将typescript
angularjs 模块注册到现有es5
angularjs 应用程序的方式:
module.exports = (ngModule) => {
// Load routes.
let login = require('./login');
ngModule.config(($stateProvider) => login.LoginModule($stateProvider));
};
当我运行应用程序并访问登录页面 时,我的开发者控制台中抛出了一个错误:
TypeError:无法读取 ChildScope.LoginController.hasEmail 处未定义的属性“loginModel”(login.controller.ts:26)
这是生成的源地图:
从错误消息的内容来看,即使在构造函数中this.$scope
声明了第 26 行,也无法识别它。public $scope: ILoginScope
我在做什么错?
谢谢,
解决方案
推荐阅读
- swift4 - iOS RXSwift 什么是 debounce 的等价物,它只允许通过第一个事件?
- javascript - 用css组织html结构
- laravel-5 - Laravel Eager Loading 不起作用,而延迟加载同样有效
- asp.net - Cookie 过期返回 1/1/0001 12:00:00 AM
- c++ - 使用 DnsQuery 或 getaddrinfo 的正确功能是什么?
- python - 如何在熊猫数据框Python中查找带分隔符的字符串并用新行替换它们
- system-verilog - 使用或不使用 get_full_name() 创建 uvm_reg_field 有什么区别
- python-3.x - 在两个不同的窗口上使用 overridedirect 时,OptionMenu 不起作用
- html - 如何在 SVG 的对象中居中文本?
- ios - swift 中协议所需的方法是动态的,那么说 swift 比目标 c 快多少?