如何在Javascript中获取对象的正确上下文

时间:2016-07-23 00:31:53

标签: javascript dojo

我有一个名为TestClass的班级。它有一个TooltipDialog对象成员和一个testFunc函数 在ToolTipDialog中,它有单选按钮 当用户点击单选按钮时,它会执行testFunc 我的问题是:当用户点击单选按钮时,如何获取父上下文(TestClass)? 可以执行像TestClass.testFunc()这样的事情 当我尝试testFunc时,错误是:testFunc is not defined
当我尝试使用this.testFunc时,错误为this.testFunc is not a function

TestClass的代码如下,小提琴链接为js code

define(["dojo/_base/declare","dojo/dom","dojo/on","dojo/_base/lang","dijit/registry",
        "dijit/TooltipDialog","dijit/popup","esri/InfoWindowBase",
         "dojo/_base/array"],
    function (declare,dom,on,lang,registry,TooltipDialog,popup,InfoWindowBase,Array) {
    return declare(  
        InfoWindowBase,
                {
            constructor: function (parameters) {
                //lang.mixin(this, parameters);
                this.son = "";
            },
            //member of the ParentClass
            init: function ( ) {
                var tpContent = '<div id="dp1"><label for="name">first:</label> <input type="radio" id="first" checked value="pri"/>' +
                    '<br><label for="hobby"> second:</label> <input type="radio" id="second" value="sec"/></div>';

                this.inherited(arguments);
                this.son = new TooltipDialog({
                    content: tpContent,
                    onMouseLeave: function (e) {

                    }
                ,
                    onOpen: function (e) {
                    var sHu=dom.byId("first");
                        on(sHu,"click", function(){
                            // this.testFunc();
                        });

                    },

                });

                popup.open({
                    popup: this.son,
                    orient: ["above","below"],
                    around: dom.byId("tpHolder")
                });

            },
            testFunc:function(){
                console.log("testFunc");
            }
        }
    );

});

2 个答案:

答案 0 :(得分:0)

事件的上下文将始终是发生事件的控件/节点,在这种情况下,它将是对象:sHu。您可以使用lang.hitch方法更改上下文。

on(sHu,"click", lang.hitch(this, function(){
    this.testFunc();
}));

不需要传递this,您可以更改为您想要的任何对象作为函数的上下文。

答案 1 :(得分:0)

正如@T Kambi所说,你需要使用hitch。 但就你而言,你需要加倍hitch

onOpen: lang.hitch(this, function (e) {
     var sHu=dom.byId("first");
     on(sHu,"click", lang.hitch(this, function(){
          this.testFunc();
     }));
}),

第一个hitch会使this成为TestClass方法中的onOpen,而第二个hitch将成为this onOpen方法是this处理程序的click

我修复了JSFiddle,所以你看看:https://fiddle.jshell.net/etxx1o0s/5/