配置屬性
靜態(tài)成員中最重要的就是ATTRS,其中列出了你的類所需的所有配置參數(shù)。例如你需要一個(gè)名為value的成員,這個(gè)成員用于保存一個(gè)數(shù)字,默認(rèn)初始值為0,可以這樣傳入第五個(gè)參數(shù)。 ATTRS: { value: { value: 0, validator: Lang.isNumber } }
ATTRS中當(dāng)然可以寫入多個(gè)成員,每個(gè)成員都下轄各自的配置項(xiàng),通過閱讀addAttr()來了解更多參數(shù)配置。我們看到,validator使用了之前代碼中定義的縮寫Lang,驗(yàn)證函數(shù)得到一個(gè)實(shí)參的輸入,返回一個(gè)布爾值,所有的Y.Lang.isXxxx都可以作為校驗(yàn)函數(shù),當(dāng)然,為了更嚴(yán)格細(xì)致的校驗(yàn),你可能需要定義新的validator、setter和getter,這里推薦使用字符串作為句柄賦值給validator、setter或者getter,Attribute會(huì)將字符串對應(yīng)到具體的函數(shù)。比如要定義一個(gè)validCodes屬性,可以接收單個(gè)值或者一個(gè)數(shù)組,但應(yīng)當(dāng)統(tǒng)一返回一個(gè)數(shù)組: ATTRS: { validCodes: { setter: ‘_setValidCodes’ } }
我們需要在Y.Base.create()的第四個(gè)參數(shù)中聲明_setValidCodes方法,其他的成員也可以在這里追加聲明。 _setValidCodes: function (value) { if (!Lang.isArray(value)) { value = [ value ]; } return value; }
除非函數(shù)足夠簡單,最好單獨(dú)重寫setter、setter和validator,傳入他們的函數(shù)名作為實(shí)參,讓Attribute將函數(shù)名對應(yīng)到真實(shí)的函數(shù)。
總之,使用setter作為標(biāo)準(zhǔn)輸入,這樣會(huì)為組件帶來一些非常有用的特性。比如配置項(xiàng)值的改變會(huì)觸發(fā)beforeChange和afterChange事件,如果在beforeChange事件中停止事件,則可以阻止屬性的更改,因此組件實(shí)例生成后,請善用自定義事件。比如你如果綁定了afterChange事件,如果觸發(fā)了回調(diào),那么一定是值被改變了,而不是即便試圖更改屬性值卻在beforeChange中被阻止了。
validator和setter的校驗(yàn)強(qiáng)度是你來決定的,如果你的validator的校驗(yàn)邏輯很嚴(yán)格,就不用再在setter中添加嚴(yán)格的校驗(yàn),甚至不需要setter,反之亦然,setter校驗(yàn)很嚴(yán)格的話也可以缺省validator。比如,下面兩句代碼,你可以任選其一: validator: Y.Lang.isBoolean, // to make the attribute accepts strictly a Boolean setter: Boolean, // to make the attribute accept any value and have Boolean
Setter也可以作為校驗(yàn)器來使用。如果輸入的值不能轉(zhuǎn)換成attribute可接受的值,setter就會(huì)返回Y.Attribute.INVALID_VALUE。這種情況下,attribute不會(huì)發(fā)生改變。
當(dāng)我定義成員的時(shí)候,通常會(huì)指定這個(gè)常量,并放在模塊的頂部(和CBX, BBX這些縮寫聲明一起),例如: var VALUE = ‘value’, VALID_CODES = ‘validCodes’;
這樣做的原因是,在一個(gè)模塊內(nèi)可能會(huì)多次用到這個(gè)值,使用常量更加方便。但是,請千萬別在屬性聲明中使用這些常量。 ATTRS: { // *** Don’t do this *** // VALUE: { value: 0, validator: Lang.isNumber } }
這樣書寫會(huì)生成一個(gè)名為VALUE而不是value的屬性成員,同時(shí)記住,不要覆蓋基類中的屬性成員,Widget中已經(jīng)有許多屬性成員(見表格),如boundingBox、visible、disabled、height、width等,你也可以修改他們,Y.Base.create()會(huì)將父類和基類(Base)中的屬性成員合并,所以要重載已有的屬性成員,你只要在派生類中重復(fù)定義即可。
當(dāng)你要定義的屬性成員是數(shù)組或者對象的時(shí)候要尤為小心,對象(數(shù)組)是一個(gè)引用值,如果初始化的屬性中含有object,他們(所有實(shí)例的這個(gè)成員)指向的會(huì)是同一個(gè)object。當(dāng)你更改這個(gè)object或者刪除的時(shí)候,所有的實(shí)例也都跟著改變(prototye永遠(yuǎn)指向父類的prototye),所以,Base提供了克隆的機(jī)制,在你傳入object屬性成員的時(shí)候克隆一份,這會(huì)避免引用重復(fù)的問題,其他objects的初始化,請使用valueFn參數(shù),或者直接在類的構(gòu)造函數(shù)(initialize)中構(gòu)建他們。
出處:Taobao.com UED Team
責(zé)任編輯:bluehearts
上一頁 使用YUI 3開發(fā)Web應(yīng)用的訣竅 [2] 下一頁 使用YUI 3開發(fā)Web應(yīng)用的訣竅 [4]
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。
|