Javascript-Dojo-Object对自身的引用

Javascript-Dojo-Object对自身的引用,javascript,events,class,dojo,Javascript,Events,Class,Dojo,我使用DojoJSFramework 1.6来声明和跟踪自定义类。我想使用这些类来创建可重用的功能,如用户编辑对话框等 但是,问题是,例如,在类中使用方法创建dojo html类型按钮时。如果该按钮需要在类中回调一个方法,则它不知道要调用的实例化变量 我如何让stage2在不硬编码对象名的情况下引用这个类实例 示例类: dojo.provide('edit.contacts'); dojo._hasResource["edit.contacts"] = true; dojo.declare("

我使用DojoJSFramework 1.6来声明和跟踪自定义类。我想使用这些类来创建可重用的功能,如用户编辑对话框等

但是,问题是,例如,在类中使用方法创建dojo html类型按钮时。如果该按钮需要在类中回调一个方法,则它不知道要调用的实例化变量

我如何让stage2在不硬编码对象名的情况下引用这个类实例

示例类:

dojo.provide('edit.contacts');
dojo._hasResource["edit.contacts"] = true;

dojo.declare("edit.contacts", null,
{
   /*
   *     Init
   */
   init   : function(customer_id)
   {
      var out = ''
      +'<button dojoType="dijit.form.Button" onClick="stage2();" />Edit</button>'
      +'';

      // Create the dlg box
      var edit_contacts_dlg = new dijit.Dialog(
      {
         title    : 'New Diag',
         style    : 'width:550px; height:600px;background:#FFFFFF;',
         id       : 'edit_contacts_dlg',
         content  : out
      }).show();
   },

   /*
   *     Stage 2
   */
   stage2   :  function()
   {
      alert('halllo');
   }
}
dojo.provide('edit.contacts');
dojo._hasResource[“edit.contacts”]=true;
declare(“edit.contacts”,null,
{
/*
*初始化
*/
初始化:函数(客户id)
{
var out=''
+“编辑”
+'';
//创建dlg框
var edit_contacts_dlg=新建dijit.Dialog(
{
标题:“新诊断”,
样式:“宽度:550px;高度:600px;背景:#FFFFFF;”,
id:“编辑联系人”,
内容:外
}).show();
},
/*
*第二阶段
*/
阶段2:函数()
{
警惕(“哈洛”);
}
}

用法示例:

我不是真的使用Dojo,但我尝试了一些东西。看起来你可以像平常一样使用它。尝试这个演示:

我不是真的使用Dojo,但我尝试了一些东西。看起来你可以像平常一样使用它。尝试这个演示:

这是一个范围问题。你将永远面临这个问题混合使用JS和HTML来创建节点或小部件时会出现这种问题。在调用init()方法时,需要引用button小部件的实例,但由于使用HTML和dojo.parser来创建按钮,所以没有引用。基本上,有三种解决方法:

  • 以编程方式创建按钮,并直接或通过dojo.connect为其提供onClick。这非常灵活,因为您可以使用作用域中的任何变量将任何函数传递给onClick

    var out = new dijit.form.Button({
        label: 'Edit',
        onClick: dojo.hitch(this, 'stage2')
    });
    var edit_contacts_dlg = new dijit.Dialog({
        title    : 'New Diag',
        style    : 'width:550px; height:600px;background:#FFFFFF;',
        id       : 'edit_contacts_dlg_' + uniqueId,
        content  : out
    }).show();
    
  • 为edit.contants类的每个实例生成唯一id,并将其插入html字符串中。然后通过dijit.byId()获取按钮实例,并执行上述连接:

    var out = '<button dojoType="dijit.form.Button" id="' + uniqueId + '">Edit</button>';
    var edit_contacts_dlg = new dijit.Dialog({
        title    : 'New Diag',
        style    : 'width:550px; height:600px;background:#FFFFFF;',
        id       : 'edit_contacts_dlg_' + uniqueId,
        content  : out
    }).show();
    var btn = dijit.byId(uniqueId);
    dojo.connect(btn, "onClick", this, "stage2");
    
    var out='Edit';
    var edit_contacts_dlg=新建dijit.Dialog({
    标题:“新诊断”,
    样式:“宽度:550px;高度:600px;背景:#FFFFFF;”,
    id:'edit_contacts_dlg_'+uniqueId,
    内容:外
    }).show();
    var btn=dijit.byId(uniqueId);
    connect(btn,“onClick”,这是“stage2”);
    
  • 基于dijit.\u小部件和dijit.\u模板创建类,即小部件,并使用其数据dojo附着点功能获取按钮实例():

    dojo.require(“dijit.\u小部件”);
    dojo.require(“dijit._模板化”);
    require(“dijit.Dialog”);
    require(“dijit.form.Button”);
    ready(function()){
    declare(“edit.ContactTemplate”,[dijit.\u小部件,dijit.\u模板化]{
    templateString:“编辑”,
    widgetsInTemplate:正确
    }) 
    declare(“edit.contacts”,null{
    初始化:函数(customerId){
    this.customerId=customerId;
    var widget=new edit.ContactTemplate();
    connect(widget.editbn,“onClick”,这个是“stage2”);
    this.editContactDlg=新建dijit.Dialog({
    标题:“对话框:”+customerId,
    样式:“宽度:200px;高度:80px;背景:#ffffffff;”,
    id:“编辑联系人”+customerId,
    内容:小部件
    });
    this.editContactDlg.show();
    归还这个;
    },
    阶段2:函数(){
    警报(this.customerId);
    }
    });
    var c1=新编辑的.contacts().init(“客户1”);
    var c2=新的edit.contacts().init(“客户2”);
    });
    

  • 当您需要引用许多小部件/节点时,这非常有用。

    这是一个范围问题。在混合使用JS和HTML创建节点或小部件时,您将始终面临此类问题。在调用init()时,您需要引用按钮小部件的实例方法,因为您使用了HTML和dojo.parser来创建按钮,所以没有该方法。基本上,您有三种解决方法:

  • 以编程方式创建按钮,并直接或通过dojo.connect为其提供onClick。这非常灵活,因为您可以使用作用域中的任何变量将任何函数传递给onClick

    var out = new dijit.form.Button({
        label: 'Edit',
        onClick: dojo.hitch(this, 'stage2')
    });
    var edit_contacts_dlg = new dijit.Dialog({
        title    : 'New Diag',
        style    : 'width:550px; height:600px;background:#FFFFFF;',
        id       : 'edit_contacts_dlg_' + uniqueId,
        content  : out
    }).show();
    
  • 为edit.contants类的每个实例生成唯一id,并将其插入html字符串中。然后通过dijit.byId()获取按钮实例,并执行上述连接:

    var out = '<button dojoType="dijit.form.Button" id="' + uniqueId + '">Edit</button>';
    var edit_contacts_dlg = new dijit.Dialog({
        title    : 'New Diag',
        style    : 'width:550px; height:600px;background:#FFFFFF;',
        id       : 'edit_contacts_dlg_' + uniqueId,
        content  : out
    }).show();
    var btn = dijit.byId(uniqueId);
    dojo.connect(btn, "onClick", this, "stage2");
    
    var out='Edit';
    var edit_contacts_dlg=新建dijit.Dialog({
    标题:“新诊断”,
    样式:“宽度:550px;高度:600px;背景:#FFFFFF;”,
    id:'edit_contacts_dlg_'+uniqueId,
    内容:外
    }).show();
    var btn=dijit.byId(uniqueId);
    connect(btn,“onClick”,这是“stage2”);
    
  • 基于dijit.\u小部件和dijit.\u模板创建类,即小部件,并使用其数据dojo附着点功能获取按钮实例():

    dojo.require(“dijit.\u小部件”);
    dojo.require(“dijit._模板化”);
    require(“dijit.Dialog”);
    require(“dijit.form.Button”);
    ready(function()){
    declare(“edit.ContactTemplate”,[dijit.\u小部件,dijit.\u模板化]{
    templateString:“编辑”,
    widgetsInTemplate:正确
    }) 
    declare(“edit.contacts”,null{
    初始化:函数(customerId){
    this.customerId=customerId;
    var widget=new edit.ContactTemplate();
    connect(widget.editbn,“onClick”,这个是“stage2”);
    this.editContactDlg=新建dijit.Dialog({
    标题:“对话框:”+customerId,
    样式:“宽度:200px;高度:80px;背景:#ffffffff;”,
    id:“编辑联系人”+customerId,