116 lines
2.7 KiB
JavaScript
116 lines
2.7 KiB
JavaScript
import eventBus from '../core/utils/event-bus';
|
||
import rules from '../behaviors/rules';
|
||
|
||
|
||
Component({
|
||
externalClasses: ['l-class', 'l-error-text', 'l-error-text-class'],
|
||
behaviors: ['wx://form-field',rules],
|
||
relations: {
|
||
'../radio/index': {
|
||
type: 'child',
|
||
linked() {
|
||
// const currentLength = this.add();
|
||
// if (currentLength === this.properties.length) {
|
||
this.init();
|
||
// }
|
||
},
|
||
linkChanged() {
|
||
},
|
||
unlinked() {
|
||
this.init();
|
||
}
|
||
}
|
||
},
|
||
properties: {
|
||
current: {
|
||
type: String
|
||
},
|
||
noneChecked: {
|
||
type: Boolean,
|
||
value: true
|
||
},
|
||
placement: {
|
||
type: String,
|
||
value: 'column', //column row
|
||
},
|
||
},
|
||
data: {
|
||
currentLength: 0
|
||
},
|
||
|
||
methods: {
|
||
// add() {
|
||
// if (this.properties.length <= 0) {
|
||
// throw new Error('为提高性能,请主动设置radio-group的length属性');
|
||
// }
|
||
// return this.data.currentLength += 1;
|
||
// },
|
||
// reduce() {
|
||
// this.length -= 1;
|
||
// return this.data.currentLength -= 1;
|
||
// },
|
||
|
||
checkedKeyRepeat(items) {
|
||
let keys = items.map(item => {
|
||
return item.data.key;
|
||
});
|
||
const repeat = this.isRepeat(keys);
|
||
if (repeat !== false) {
|
||
throw new Error(`keys有重复元素, radio的key属性不能重复:${repeat}`);
|
||
}
|
||
},
|
||
|
||
isRepeat(arr) {
|
||
let hash = {};
|
||
for (let i in arr) {
|
||
if (hash[arr[i]]) //hash 哈希
|
||
return arr[i];
|
||
hash[arr[i]] = true;
|
||
}
|
||
return false;
|
||
},
|
||
|
||
init() {
|
||
const items = this.getRelationNodes('../radio/index');
|
||
this.checkedKeyRepeat(items);
|
||
this.onChangeHandle(items);
|
||
},
|
||
|
||
onChangeHandle(items) {
|
||
items.forEach((item) => {
|
||
let checked = this.properties.current === item.data.key;
|
||
item.setChecked(checked, item.data.key);
|
||
});
|
||
},
|
||
|
||
onEmitEventHandle(currentItem, select) {
|
||
this.properties.current = select?currentItem.key:null;
|
||
const items = this.getRelationNodes('../radio/index');
|
||
this.onChangeHandle(items);
|
||
// currentItem.currentKey = this.properties.current
|
||
Object.assign(currentItem, {
|
||
currentKey: this.properties.current
|
||
});
|
||
this.validatorData({
|
||
[this.data.name]: this.data.current
|
||
});
|
||
this.triggerEvent('linchange', currentItem, {
|
||
bubbles: true,
|
||
composed: true
|
||
});
|
||
eventBus.emit(`lin-form-change-${this.id}`,this.id);
|
||
},
|
||
getValues() {
|
||
return this.data.current;
|
||
},
|
||
reset() {
|
||
this.data.current = '';
|
||
}
|
||
},
|
||
observers: {
|
||
'current': function() {
|
||
this.init();
|
||
}
|
||
}
|
||
});
|