par*_*ent 12 javascript typescript
这是jquery.d.ts的jquery接口:
export interface IDialogEvent extends DialogEvent {
(event: Event, ui: DialogUIParams): void;
}
Run Code Online (Sandbox Code Playgroud)
这是我的自定义界面,模仿jquery.d.ts的DialogOptions接口的部分功能:
export interface IDialogOptions {
open: IDialogEvent;
}
export class DialogClass implements IDialogOptions {
//Dialog options
public open: IDialogEvent;
//Class related fields
public someField: any;
public dialogEl: JQuery;
constructor() {
this.open = this.OpenHandler;
this.dialogEl = $("<div></div>").dialog(this);
//Passing "this" initializes the dialog by mapping relevant class fields
//to the dialog's "option" object, in this case the only "relevant" field is "open".
}
public OpenHandler(event: Event, ui: DialogUIParams) {
var value = this.someField; //BAD. "this" is not type BaseClass
}
public NonEventHandlerMethod() {
var value = this.someField; //GOOD. "this" is type BaseClass
}
}
var dialog = new DialogClass();
dialog.dialogEl.dialog("open");
Run Code Online (Sandbox Code Playgroud)
最后一行触发OpenHandler()但在其中,this不是类型BaseDialog(不同于NonEventHandlerMethod).
我需要一个对话框选项字段的事件处理函数的原因以及我不能简单地这样做的原因:
export class DialogClass implements IDialogOptions {
...
constructor() {
this.open = () => {
//event handling logic
};
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
是因为我需要在扩展DialogClass的类中添加额外的开放事件处理逻辑,并且this.member和super.member之间没有区别...... this.function()和super.function()之间只有区别:
export class LoginDialog extends DialogClass {
...
constructor() {
this.open = this.OpenHandler;
...
}
public OpenHandler(event: Event, ui: DialogUIParams) {
super.OpenHandler(); //Base handling logic
//Additional handling logic
}
...
}
Run Code Online (Sandbox Code Playgroud)
我认为这可能是一个错误,因为
export class DialogClass implements IDialogOptions {
...
constructor() {
this.open = () => {
var test = this.someField; //Correct context
};
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
并直接调用该方法:
var dialog = new DialogClass();
dialog.OpenHandler(); //Correct context when called directly
//Note: I haven't actually tested this persay but this function is no different
//than any other functionso a direct call should certainly not be problem.
Run Code Online (Sandbox Code Playgroud)
Fen*_*ton 13
TypeScript遵循通常的JavaScript范围约定,因此this将依赖于上下文.如果您在基于事件触发的类上有方法,this则将成为事件目标.当你直接在一个类上调用一个方法时,this将是该类.
如果你想解决这个问题,你可以通过给出this一个别名来利用JavaScript如何走近范围链......
这是一种方法:
this.open = () => { this.OpenHandler(this); };
Run Code Online (Sandbox Code Playgroud)
箭头函数语法_this在JavaScript中创建和别名.
public OpenHandler(context: DialogClass, event: Event, ui: DialogUIParams) {
var value = context.someField;
}
Run Code Online (Sandbox Code Playgroud)
我们接受巧妙的别名版本this作为参数,并且context.someField应该具有我们追求的值.
| 归档时间: |
|
| 查看次数: |
38880 次 |
| 最近记录: |