2011-11-14 50 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。