'X.UI._AbstractUINode',\r
X_Class.ABSTRACT,\r
{\r
+ itemData : null,\r
+ \r
phase : 0,\r
dirty : XUI_Dirty.CLEAN,\r
\r
},\r
\r
addToParent : function( xnodeParent ){\r
+ var attr = this.attrObject || this.attrClass.prototype,\r
+ usableAttrs = this.usableAttrs,\r
+ i = 0, l = usableAttrs.length, def;\r
+ \r
xnodeParent && xnodeParent[ 'append' ]( this.xnode );\r
\r
+ if( attr ){\r
+ for( k in usableAttrs ){\r
+ def = usableAttrs[ k ];\r
+ if( def[ 2 ] === XUI_Attr_USER.XNODE && X_Object_inObject( def.No, attr ) && attr[ k ] !== def[ 0 ] ){\r
+ this.xnode[ 'css' ]( XUI_Attr_Rename[ k ] || k, XUI_AbstractUINode_createCssText( this, k ) );\r
+ };\r
+ };\r
+ };\r
+ \r
this.phase = 2;\r
this[ 'dispatch' ]( XUI_Event.ADDED );\r
},\r
this.User[ 'dispatch' ]( XUI_Event.CREATION_COMPLETE );\r
\r
// html 要素が親に追加されるまで控えていたイベントの登録\r
+ // TODO listenOnce\r
if( events && ( l = events.length ) ){\r
for( i = 0; i < l; ++i ){\r
this.listen.apply( this, events[ i ] );\r
\r
if( !v && v !== 0 ) v = defaultVal;\r
\r
+ // UIAttrClass の初期設定の場合、ここで終わる\r
if( XUI_attrClassProto ){\r
attrs[ propID ] = v;\r
return; \r
return ret;\r
},\r
\r
- setItemData : function(){\r
- // this[ 'dispatch' ]( UI_Event.ITEMDATA_CHANGED );\r
+ setItemData : function( itemData ){\r
+ if( this.itemData === itemData ) return;\r
+\r
+ this.itemData = itemData;\r
+\r
+ this[ 'dispatch' ]( { type : XUI_Event.ITEMDATA_CHANGED, itemData : itemData } );\r
+ // itemData && itemData.listen( X_Event_CHANGED )\r
+ // dataFeild dataFormatter dataValidator\r
+ \r
// itemData.listen( X_Event_CHANGED ) -> this[ 'dispatch' ]( UI_Event.ITEMDATA_UPDATED );\r
}\r
\r
};\r
};\r
} else\r
- if( X_Type_isString( nameOrObject ) ){\r
+ if( X_Type_isString( nameOrObject ) && ( def = p.usableAttrs[ nameOrObject ] ) ){\r
if( valueOrUnit !== undefined ){\r
if( 'em,%'.indexOf( valueOrUnit ) === -1 ){\r
// setter\r
- p.setAttr( nameOrObject, valueOrUnit );\r
+ p.setAttr( nameOrObject, def, valueOrUnit );\r
} else {\r
// getter with unit\r
return p.getAttrWithUnit( nameOrObject, valueOrUnit );\r
* Repeater に於いて、繰り返されるアイテムの元(itemRenderer)からの複製に使用\r
*/\r
clone : function( opt_cloneListener ){\r
- var newNode = this.constructor(),\r
- newPair = X_Pair_get( newNode ),\r
+ var newNode,\r
+ //newPair = X_Pair_get( newNode ),\r
pair = X_Pair_get( this ),\r
attr, listeners, type, list, i, l;\r
\r
+ // attr もコピー\r
+ if( pair.attrObject ){\r
+ attr = {};\r
+ for( k in pair.usableAttrs ){\r
+ def = pair.usableAttrs[ k ];\r
+ attr[ k ] = pair.attrObject[ def.No ];\r
+ };\r
+ newNode = this.constructor( attr );\r
+ };\r
+\r
// handleEvent 等の拡張されたオブジェクトもコピーする!\r
for( k in this ){\r
if( this[ k ] !== newNode[ k ] && !newNode[ k ] ) newNode[ k ] = this[ k ];\r
\r
// User.UINODE な値は pair にコピーされているのでこれをコピー\r
for( k in pair ){\r
- if( pair[ k ] !== newPair[ k ] && !newPair[ k ] ) newPair[ k ] = pair[ k ];\r
+ //pair[ k ] !== newPair[ k ] && !newPair[ k ] && console.log( k );\r
+ //if( pair[ k ] !== newPair[ k ] && !newPair[ k ] && k !== 'attrObject' && k !== '_listeners' ){\r
+ //newPair[ k ] = pair[ k ];\r
+ //console.log( k );\r
+ //};\r
};\r
\r
- // attr もコピー\r
- if( pair.attrObject ){\r
- attr = pair.attrClass();\r
- for( k in pair.attrObject ){\r
- if( pair.attrObject[ k ] !== attr[ k ] ) attr[ k ] = pair.attrObject[ k ];\r
- };\r
- newPair.attrObject = attr;\r
- };\r
+\r
\r
// listener もコピーする!\r
if( opt_cloneListener && ( listeners = pair[ '_listeners' ] ) ){\r
};\r
}; \r
};\r
+ } else\r
+ if( opt_cloneListener && ( list = this.reserveEvents ) ){\r
+ for( i = 0, l = list.length; i < l; ++i ){\r
+ f = list[ i ];\r
+ newNode[ f.once ? 'listenOnce' : 'listen' ]( f[ 0 ], newNode, f[ 1 ], f[ 2 ] );\r
+ }; \r
};\r
\r
return newNode;\r