Skip to content

Commit

Permalink
#33
Browse files Browse the repository at this point in the history
  • Loading branch information
minghe committed Oct 12, 2012
1 parent f26ae17 commit 66450dc
Show file tree
Hide file tree
Showing 7 changed files with 270 additions and 70 deletions.
5 changes: 4 additions & 1 deletion gallery/form/1.3/auth/field/field.js
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,10 @@ KISSY.add('gallery/form/1.3/auth/field/field', function (S, Event, Base, JSON, D
//element event bind
if (_cfg.event != 'none') {
Event.on(self.get('el'), _cfg.event || Utils.getEvent(_el), function (ev) {
self.validate();
//增加个延迟,确保原生表单改变完成
S.later(function(){
self.validate();
})
});
}

Expand Down
66 changes: 41 additions & 25 deletions gallery/form/1.3/butterfly/collection.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
KISSY.add('gallery/form/1.3/butterfly/collection',function (S, Base, Node,Field,SelectField) {
KISSY.add('gallery/form/1.3/butterfly/collection',function (S, Base, Node,Field,SingleSelectField,MultipleSelectField) {
var EMPTY = '',$ = Node.all;
/**
* 表单的数据模块
Expand All @@ -19,31 +19,14 @@ KISSY.add('gallery/form/1.3/butterfly/collection',function (S, Base, Node,Field,
if(!S.isObject(data)) return false;
//字段name
var name = data.name;
//字段类型
var type = data.type;
//字段目标元素
var $target = data.target;
if(!name || !type || !$target) return false;

var self = this;

//已经存在该字段直接返回该字段
if(self.isExist(name)) return self.field(name);

var field = EMPTY;

//为选择类型的数据模型
if(self.isSelectFieldType(type)){
name = $target.attr('name');
//通过name来获取元素集合
if(name){
data.target = $(document.getElementsByName(name));
}

field = new SelectField(data);
}else{
field = new Field(data);
}
//数据模型类
var FieldClass = self.getField(data);
//实例化数据模型
var field = new FieldClass(data);

//向集合添加字段数据模型
var fields = self.get('fields');
Expand All @@ -61,6 +44,16 @@ KISSY.add('gallery/form/1.3/butterfly/collection',function (S, Base, Node,Field,
if(!type) return false;
return S.inArray(type,selectFieldTypes);
},
/**
* 是否是类似checkbox的多选方式的表单域
* @param {String} type
* @return {Boolean}
*/
isMultipleType:function(type){
var multipleTypes = ['checkbox'];
if(!type) return false;
return S.inArray(type,multipleTypes);
},
/**
* collection中是否存在该字段的数据
* @param {String} name 字段名称
Expand Down Expand Up @@ -106,16 +99,39 @@ KISSY.add('gallery/form/1.3/butterfly/collection',function (S, Base, Node,Field,
})
}
return field;
},
/**
* 获取数据模型
*/
getField:function(data){
var FieldClass = Field;
if(!S.isObject(data)) return FieldClass;

var self = this;
//字段name
var name = data.name;
//字段类型
var type = data.type;
//字段目标元素
var $target = data.target;
if(!name || !type || !$target) return FieldClass;

//为选择类型的数据模型
if(self.isSelectFieldType(type)){
name = $target.attr('name');
//通过name来获取元素集合
if(name) data.target = $(document.getElementsByName(name));
FieldClass = self.isMultipleType(type) && MultipleSelectField || SingleSelectField;
}
return FieldClass;
}
},{
ATTRS:{
Field:{value:Field},
SelectField:{value:SelectField},
fields:{
value:[]
},
data:{value:EMPTY}
}
});
return Collection;
},{requires:['base', 'node','./field/base','./field/selectField']});
},{requires:['base', 'node','./field/base','./field/singleSelect','./field/multipleSelect']});
145 changes: 145 additions & 0 deletions gallery/form/1.3/butterfly/field/multipleSelect.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
/**
* 模块名:gallery/form/1.3/butterfly/selectField
*
* @module butterfly
* @submodule butterfly-model
*/

KISSY.add('gallery/form/1.3/butterfly/field/multipleSelect',function (S, Base, Node,SingleSelect) {
var EMPTY = '';
var $ = Node.all;
/**
* 应用于radio或checkbox或select的数据模块,是存在多个target、多个value、增加select和index的处理
* @class SelectField
* @constructor
*/
function MultipleSelect(config){
MultipleSelect.superclass.constructor.call(this, config);
this._setDefaultValue();
}
S.extend(MultipleSelect, SingleSelect,{
/**
* 设置默认的value属性
* @private
*/
_setDefaultValue:function(){
var self = this;
var $target = self.get('target');
var values=[];
$target.each(function($el){
if($el.prop('checked')) values.push($el.val());
});
self.set('value',values);
},
/**
* 监听事件,同步字段的选中
* @private
*/
_syncValue:function(){
var self = this;
var $target = self.get('target');
if(!$target || !$target.length) return false;
var syncValueEvents = self.get('syncEvents');
//监听需要同步的事件
$target.on(syncValueEvents,function(ev){
var val = $(ev.target).val();
self.set('isHtmlClick',true);
self.set('value',val);
})
},
/**
* 处理多选框的选中
* @private
*/
_checked:function(value,indexs){
var self = this;
var $target = self.get('target');
var options = self.get('options');
//是否由原生的html改变触发的值设置
var isHtmlClick = self.get('isHtmlClick');
S.each(options,function(option,index){
if(value == option){
if(!isHtmlClick){
$($target[index]).fire('click');
self.set('isHtmlClick',true);
}
indexs.push(index);
}
})
}
},{ATTRS:{
/**
* 目标表单字段
*/
target:{
value:EMPTY,
getter:function(v){
return S.Node.all(v);
}
},
/**
* 同步表单字段值的事件
*/
syncEvents:{
value:'change'
},
/**
* 字段类型
*/
type:{value:EMPTY},
/**
* 字段名
*/
name:{value:EMPTY},
/**
* 字段当前选中的值(多个)
* @type {Array}
* @default []
*/
value:{
value:[],
setter:function(v){
var self = this;
var options = self.get('options');
var indexs = [];

if(S.isString(v) && options.length > 0){
var values = self.get('value');
if(!S.isArray(values)) return [];
var isExist = S.inArray(v,values);
if(!isExist){
indexs = self.get('indexs');
values.push(v);
self._checked(v,indexs);
self.set('indexs',indexs);
}
return values;
}

if(S.isArray(v) && options.length > 0){
S.each(v,function(value){
self._checked(value,indexs);
});
self.set('indexs',indexs);
}
return v;
}
},
/**
* 字段选中的索引值
* @type {Array}
* @default []
*/
indexs:{ value:[] },
/**
* 选项值,为数组
* @type {Array}
* @default []
*/
options:{ value:[] },
isHtmlClick:{value:false},
//auth的验证字段
authField:{ value:EMPTY }
}});
return MultipleSelect;
},{requires:['base', 'node','./singleSelect']});
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
* @submodule butterfly-model
*/

KISSY.add('gallery/form/1.3/butterfly/field/selectField',function (S, Base, Node) {
KISSY.add('gallery/form/1.3/butterfly/field/singleSelect',function (S, Base, Node) {
var EMPTY = '';
var $ = Node.all;
/**
Expand Down Expand Up @@ -79,12 +79,6 @@ KISSY.add('gallery/form/1.3/butterfly/field/selectField',function (S, Base, Node
})
}
},{ATTRS:{
/**
* 为选择类型的表单域,比如radio或checkbox或select
* @type {Boolean}
* @default true
*/
isSelectField:{value:true},
/**
* 目标表单字段
*/
Expand Down
Loading

0 comments on commit 66450dc

Please sign in to comment.