一、引言
这两天写arcgis javascript代码的时候,自己以为对dojo的amd规范掌握了,可是后来碰到了一个问题,在每个module中成员函数调用另外一个成员函数必须使用this调用(这点不像java和C#,可以不使用this),这样当在module中一个成员函数中有click事件的时候this已经不是指向该类了,so如何解决==
二、遇到问题
/**
* Created by xcy on 2017/2/22.
*/
define(["dojo/_base/declare"], function(declare) {
return declare("",null,{
//界面初始化函数
startup:function () {
alert("startup");
this.init1();
this.init2();
this.initclick();
},
init1:function () {
alert("init1");
},
init2:function () {
alert("init2");
},
initclick:function () {
$("#bt_1").click(function () {
this.init1();
});
}
});
});
当一般情况下调用成员函数的时候直接this+成员函数就ok,可是在上述代码中initclick(初始化控件事件函数)需要获取控件,在点击事件中使用其他成员函数,这个时候就会报错==
三、解决方法
下面介绍两种解决方法
3.1 lang.hitch改变指针
/**
* Created by xcy on 2017/2/22.
*/
define(["dojo/_base/declare","dojo/_base/lang"], function(declare,lang) {
return declare("",null,{
//界面初始化函数
startup:function () {
alert("startup");
this.init1();
this.init2();
this.initclick();
},
init1:function () {
alert("init1");
},
init2:function () {
alert("init2");
},
initclick:function () {
$("#bt_1").click(lang.hitch(this, function () {
this.init1();
}));
}
});
});
这种情况下把click事件中的this指向修改为该类,所以直接可以调用了,挺简单,不过每次遇到这种情况得写这么句话。3.2 提前写个变量记录this
/**
* Created by xcy on 2017/2/22.
*/
define(["dojo/_base/declare","dojo/_base/lang"], function(declare,lang) {
var self;
return declare("",null,{
//界面初始化函数
init:function () {
self=this;
alert("main2_init");
this.inittest();
this.initclick();
},
inittest:function () {
alert("main2_init1");
},
initclick:function () {
$("#bt_1").click( function () {
self.inittest();
});
}
});
});
这里我在外面写了个self变量用于存储this,然后在click事件里面可以随时直接使用,但是就是self里面有self造成资源浪费。四、总结
主要内容
- 类内成员函数调用成员函数出现问题
- 改变this指向解决上述问题
- 利用全局变量解决上述问题