我正在为Google地图v2创建一个控件。在创建我的控件时,我发现了设计挑战,并希望找到合适的解决方案。这是货物。
自定义Google控件继承自GControl;
myControl.prototype = new GControl();
接下来我需要重载初始化程序,所以在这里。
myControl.prototype.initilize = function (map) {
//do some work and return stuff
};
现在在我的自定义控件initlize函数中,我创建了一些元素,使用GEvent类,我订阅了各种事件。为了使我的回调函数可以管理,我将它们包含在控件原型中。
myControl.prototype.onEvent = function(e){
//do some work;
//modify the members of the current myControl instance
};
在我的回调函数“onEvent”中,我想修改控件中的成员。 从函数访问我的控件的最佳方法是什么?不能使用关键字“this”,因为这是对单击元素的引用,在我的例子中是div。我无法通过原型访问成员,因为我需要一个特定的对象实例。我考虑过的唯一可行的解决方案是在我的一个脚本中全局创建我的控件。这是最好的方法吗?
答案 0 :(得分:1)
我能想到的最简单的事情是,在构造函数中定义你的onEvent
方法,你可以快速访问当前的对象实例,而不必修改你的公共API:
function MyControl () {
var instance = this; // store a reference to 'this'
this.onEvent = function (e) {
// use the instance variable
instance.otherMethod();
};
}
请注意,在此方法中,onEvent
属性将物理存在于对象实例中(obj.hasOwnProperty('onEvent') = true
)。
修改:您只需使用GEvent.bind
功能:
GEvent.bind(map, "click", myObj, myObj.onEvent);
上述bind
方法将强制执行上下文,因此this
内的myObj.onEvent
关键字将在事件触发时指向myObj
对象实例,它将起作用用你的代码没有问题。
答案 1 :(得分:0)
我不熟悉你如何使用GEvent订阅活动,所以我会把它放到一边。这样做:
myControl.prototype.onEvent = function(e, instance) {
// do some work
// modify members of 'instance'
};
function wrap(handler, instance) {
return function(e) {
handler(e, instance);
}
}
GEvent.Register('Event', wrap(instance.onEvent, instance));