2011-11-14 44 views
1

我如何去克隆一个Dojo窗体(dijit.form.Form)及其子窗口小部件?理想情况下,我想要更改克隆小部件的Id。我也有兴趣克隆可能附加到小部件的任何事件。dojo:如何克隆小部件?

我玩过dojo.clone,但只适用于DOM对象。

感谢

+0

示例代码会有帮助。看起来你真的需要从'dijit.form.Form'继承。 Dojo会处理确保id对你来说是独一无二的,所以这应该是一个非问题。 – fncomp

+0

您是否在Dojo 1.7中使用异步加载器? – fncomp

+0

不,不在Dojo 1.7中使用异步加载器。使用Dojo 1.6.1 – Ayyoudy

回答

2

假设继承真的是你需要什么,然后我只是做一个新部件。假设你正在使用异步加载器和Dojo 1.7。我会做这样的事情:

define([ 
    'dojo', 
    'module', 
    'dijit/form/Form', 
    'dijit/form/TextBox', 
    'dijit/_TemplatedMixin', 
    'dijit/_WidgetsInTemplatedMixin' 
], function (dojo, module, Form, TextBox, _TemplatedMixin, _WidgetsInTemplatedMixin) { 
    // I have a wrapper for declare that handles this, but... 
    return dojo.declare(module.id.replace(/\//g, '.'), [Form, _TemplatedMixin, _WidgetsInTemplatedMixin], { 

     widgetsInTemplate: true, 

     // Make a template, I usually use a separate file. 
     templateString: '<form data-dojo-type="dijit.form.Form">' + 
          '<input data-dojo-type="dijit.form.TextBox" />' + 
         '</form>' 

     postCreate: function() { 
      this.inherited(arguments); 
      // Attach your specialized events. 
     } 
    }); 
}); 

如果您使用同步加载器,那么你会希望dojo.declare

dojo.provide('mynamespace.CustomForm'); 

// Do this for all child widgets and anything else you use. 
dojo.require('dijit.form.Form'); 
dojo.require('dijit._Templated'); 
dojo.require('dijit.form.TextBox'); 

dojo.declare('mynamespace.CustomForm', [dijit.form.Form, dijit._Templated], { 

     widgetsInTemplate: true, 

     // Make a template, I usually use a separate file. 
     templateString: '<form dojoType="dijit.form.Form">' + 
          '<input dojoType="dijit.form.TextBox" />' + 
         '</form>' 

     postCreate: function() { 
      this.inherited(arguments); 
      // Attach your specialized events. 
     } 
    }); 
}); 

你的模块将是可用var container = someElement; new path.to.File({}, container);。或者你可以在你的标记中声明这个小部件。让我知道是否可以使这个更具体或适用于不同版本的Dojo。