当我想在另一个模块中创建全局函数时,我遇到了一个问题
utils.ts文件(包含全局函数)
/// <reference path="jquery/index.d.ts" />
/// <reference path="knockout/index.d.ts" />
'use strict';
module com.test.project {
export class utils {
self: any;
constructor() {
this.self = this;
}
public postData(url: string, data: any): any {
var dfd = $.Deferred();
$.ajax({
url: url,
data: JSON.stringify(data),
type: 'post',
contentType: "application/json; charset=utf-8",
dataType: 'json',
cache: false,
success: function(result) {
return dfd.done(result);
},
error: function(result) {
return dfd.reject(result);
}
});
}
}
}
login.ts(在里面调用全局函数)
/// <reference path="jquery/index.d.ts" />
/// <reference path="knockout/index.d.ts" />
'use strict';
module com.test.project.login {
export class ScreenModel {
self: any;
userName: KnockoutObservable<string>;
password: KnockoutObservable<string>;
constructor() {
this.self = this;
this.userName = ko.observable("") as KnockoutObservable<string>;
this.password = ko.observable("") as KnockoutObservable<string>;
}
private submit(): void {
var dataObject = {
"userName": this.userName(),
"password": this.password()
}
// ↓ error here
com.test.project.utils.postData("loginService.do", dataObject).done(function(result) {
window.location.href = "index.do";
}).reject(function(result) {
alert("error");
});
}
}
$(document).ready(function() {
ko.applyBindings(new ScreenModel());
});
}
模块com.test.project和类utils中的全局函数,通常是模块中的全局函数调用者,如com.test.project。[function]和类ScreenModel。 如何调用ScreenModel类中的全局函数?
答案 0 :(得分:0)
您已在问题标题中找到它:您必须将其声明为static
,例如public static postData
。生成的JavaScript存在巨大差异,请参阅typescript playground。
如果没有静态,则将函数分配给原型,因此您需要该类的实例来调用该函数。
答案 1 :(得分:0)
我认为你在Java风格中考虑的太多了:我建议你在utils
模块中声明一个带有postData
函数的对象,然后在你的登录中导入该对象模块。
这样的事情:
export const utils = {
postData(url, data) {
$.ajax({})
}
}
// ....
import { utils } from './utils'
utils.postData(url, data)
...
OR
仅导出您的util
功能
export function postData(....)
import { postData } from './utils'
postData()