import { Component, ComponentProps, Event, console } from "waft"; import { JSON, JSONObject } from "waft-json"; export class Picker extends Component { keys: Array = new Array(); // 级联列表用到 isCascade: boolean = false; pickerData: JSONObject = new JSONObject(); // 选择器初始数据,用于更新级联选择器 pickerCurrentData: Array = new Array() //选择器当前数据 constructor(props: ComponentProps) { super(props); } willMount(props: JSONObject): void { console.log('willMount: ' + props.toString()) this.initPickerData(props); } deriveDataFromProps(props: JSONObject): void { console.log('deriveDataFromProps: ' + props.toString()) this.initPickerData(props); } initPickerData(props: JSONObject): void { // 根据pickerData确定当前pick类型 单列/多列/多列联动 if (props.has("pickerData")) { if (props.get("pickerData") instanceof JSONObject) { // 多列联动(目前只支持两列) this.isCascade = true this.pickerData = props.getObject("pickerData"); this.keys = this.pickerData.value.keys(); console.log(this.keys.toString()); console.log(this.pickerData.toString()); this.updateOptions(0); } else { let stateTmp: JSONObject = new JSONObject(); stateTmp.set("pickerDataArray", props.getArray("pickerData")); this.setState(stateTmp); } // 初始化 pickerCurrentData let pickerDataArray = this.getDeepMergeState().getArray("pickerDataArray") for (let i = 0; i < pickerDataArray.length; i++) { let index = (pickerDataArray.value[i] as JSONObject).getInteger("index") let objTmp: JSONObject = new JSONObject() objTmp.set("index", index) objTmp.set("value", (pickerDataArray.value[i] as JSONObject).getArray("options").value[index as i32]) objTmp.set('current', (pickerDataArray.value[i] as JSONObject).getArray("options").value[index as i32]) this.pickerCurrentData.push(objTmp) } } else { throw new Error("Picker component props 'pickerData' is necessary."); } } didMount(): void { } /** * 级联列表根据第一列index更新第二列options * @param */ updateOptions(index: i64): void { let newPickerData: Array = new Array(); let obj: JSONObject = new JSONObject(); obj.set("options", this.keys), obj.set("index", index); newPickerData.push(obj); // console.log("===当前选项==="+stateTmp.toString()); newPickerData.push( this.pickerData.getObject(this.keys[index as i32]) ); let stateTmp: JSONObject = new JSONObject(); stateTmp.set("pickerDataArray", newPickerData); this.setState(stateTmp); console.log("===当前选项===" + stateTmp.toString()); } onChange(e: Event): void { console.log("==== picker组件change事件 ===="); let data = e.toJSONObject().getObject("data"); // 判断当前改变的是哪一列,更新级联列表 if (this.isCascade && data.getInteger("column-index") == 0) { this.updateOptions(data.getInteger("index")); } // 更新pickerCurrentData let objTmp: JSONObject = new JSONObject() objTmp.set("index", data.getInteger("index")) objTmp.set("value", data.getString("value")) this.pickerCurrentData[data.getInteger("column-index") as i32] = objTmp this.props.dispatch("onChange", data) } onConfirm(e: Event): void { let statusTmp: JSONObject = new JSONObject() statusTmp.set("pickerValue", this.pickerCurrentData) this.props.dispatch("onConfirm", statusTmp) } onCancel(e: Event): void { let statusTmp: JSONObject = new JSONObject() statusTmp.set("pickerValue", this.pickerCurrentData) this.props.dispatch("onCancel", statusTmp) } }