本文翻譯自:http://www.sitepen.com/blog/2011/10/14/creating-a-widget-with-full-dojox-form-manager-support/
原文作者:Ken Franqueiro
譯者:Nate(supnate@gmail.com)
作為免費Dojo支援工作的一部分,我們收到來自Pong的這樣的問題:如何讓自訂控制項能夠支援dojox.form.manager:
問題原文是:
”我想建立一個自訂的表單控制項,它組合了dijit.form.Select和dijit.form.ValidationTextBox,因為這並不是一個標準的dijit表單元素,因此它不能使用dojox.form.manager的一些功能,比如disable(), setFormValues(), observer等等。因此我想知道如何才能讓自訂表格單控制項去支援dojox.form.manager呢?“
感謝提出這個問題,Pong!在分析這個問題之前,我們注意到你對你的widget的描述-”一個dijit.form.Select和dijit.form.ValidationTextBox的組合“-聽上去這很像dijit.form.FilteringSelect已經做了這件事情。並且dijit.form.FilteringSelect已經能很好的支援dojox.form.Manager。如果你沒有試過這個控制項也許可以去看看。你可以通過這個連結來看到相關的例子:this trivial dojox.form.Manager example.
好了,既然你已經建立了自訂控制項,那麼我們來看看dojox.form.Manager需要控制項提供哪些東西才能去管理它們。
首先最重要的是,dojox.form.Manager僅僅跟蹤管理那些繼承自dijit.form._FormWidget的控制項。因此,你需要以此為基類,比如:
dojo.declare("my.CustomFormWidget", dijit.form._FormWidget, { /* implementation here */});
這裡簡單說明下dijit.form._FormWidget,它主要用於封裝Html的input元素,使其成為一個dijit的表單元素。特別重要的一點是對focusNode的設定,通常指向實際的input節點,從而能夠使用原生的focus行為。對於dijit.form._FormWidget還有一個進一步的擴充是dijit.form._FormValueWidget,它提供了表單元素的一些額外的準系統,用於設定和擷取表單元素的值,比如dijit.form.Select和dijit.form.FilteringSelect都繼承自這個類。
你可以在API文檔裡找到這些相關資訊,但是如果要詳細深入瞭解的話,最好還是能夠看一看它們的原始碼以瞭解它們到底是如何工作的。
值得注意的是,這些基類提供了dojox.form.Manage要使用的一些API的預設實現,如果你要做一些特別處理的話,可以覆蓋這些實現以適應實際的需求。
現在我們來看看哪些API會被dojox.form.Manager使用:
- onChange: 這是manager用於觀察的事件。(在_FormWidget中實現)
- disabled getter/setter: manager用其來enable/disable表單元素,這個disabled狀態在驗證表單時也會被使用,因為disabled元素是不會被提交的(在_FormWdiget中實現)。
- value getter/setter: manager用其擷取和設定表單元素的值。(在_FormWidget中實現)
- reset:重設表單元素的值(在_FormValueWidget)中實現。
下面兩個驗證方法也會被manager使用,但是這兩個方法並沒有被_FormWidget基類所實現,需要自己去實現。dijit.form.ValidationTextBox(被dijit.form.FilteringSelect繼承)包含了這個實現,可以參考其方法來為自己的widget提供這樣的API。
- isValid方法:如果widget的值是valid則返回true,否則返回false。manager會去檢查每一個表單元素的有效性作為自己的isValid的結果,比如當表單提交時就會調用此方法。
- validate方法: isValid僅僅返回widget是否是一個有效狀態,而validate會進行一些UI上的更新來反應當前的狀態。通常,它會調用isValid方法,然後根據結果來更新狀態。manager會在自己的validate方法裡調用每個表單元素的這個方法。
好了,希望這些資訊能夠協助你去實現自己的表單元素控制項,好運!