日期:2014-05-16  浏览次数:20421 次

Extjs处理级联数据的统一保存

原始需求:

1)有一个两级级联的表格:分组与规则,一个分组下可以有多个规则;

2)保存时要统一保存,也就是不能添加一个分组或规则就保存一下,而要到最后点击保存按钮时,把本次所有的修改一次性的提交了。

 

分析:

1)      保存时分组与规则必须关联起来。否则,如果新加两个或多个分组时,新加分组下的规则,因新加分组都没有Id,这些规则会没有办法区分自己属于哪个分组。如新增分组:[{id:’’,name:’分组1’},{id:’’,name:’分组2’}],它们下级的规则就无法通过分组id区分分组。

2)      为了解决上面新加多个分组时,区分规则与分组的对应,我把规则直接处理分组的下一级进行提交。再后台解析时,因规则直接与分组对应,也不会造成分组与规则的对应混乱。

 

实现:

Js关键代码:

		var alarmGroups = alarmGroupStore.getRange();//.getModifiedRecords(); 因为规则有变动时,分组可能没有修改,所以必须用全部分组,而且我知道分组的数量不会大,无须优化
		var alarmFormulaStore = this.getStore('alarm.AlarmFormula');
		var alarmFormul_modified = alarmFormulaStore.getModifiedRecords();
		for(idx=0;idx<alarmGroups.length;idx++){
			rec=[];arrFormula=[];
			groupId = alarmGroups[idx].get('id');
			rec.push(groupId);
			rec.push(alarmGroups[idx].get('name'));
			rec.push(alarmGroups[idx].get('isDefault'));
			// 报警规则,这个地方只处理变动的规则就可以了,不变的不管了,删除的单独处理
			Ext.Array.each(alarmFormul_modified, function(formula){
				if(formula.get('alarmGroupId')==groupId){
					recFormula=[];
					recFormula.push(formula.get('id'));
					recFormula.push(formula.get('name'));
					recFormula.push(formula.get('content'));
					recFormula.push(formula.get('background'));
					recFormula.push(formula.get('foreground'));
					recFormula.push(Ext.isNumeric(formula.get('serial'))?formula.get('serial'):1);
					recFormula.push(formula.get('isValid')=="1"?true:false);
					recFormula.push(formula.get('alarmMode'));
					recFormula.push(formula.get('alarmColumn'));
					arrFormula.push(Ext.encode(recFormula));
				}
			});
			rec.push(Ext.encode(arrFormula));
			arr.push(Ext.encode(rec));
		}
		list.push(Ext.encode(arr));

java处理关键代码:

		// 报警分组
		JSONArray jsonAlarmGroups = JSONArray.fromObject(jsonAlarm.getString(1));
		for(int i=0;i<jsonAlarmGroups.size();i++){
			JSONArray jaAlarmGroup = JSONArray.fromObject(jsonAlarmGroups.get(i));
			String alarmGroupId = jaAlarmGroup.getString(0);
			AlarmGroup alarmGroup = alarmGroupDomainService.getAlarmGroup(alarmGroupId);
			boolean isNew = false;
			if(alarmGroup==null){
				alarmGroup = new AlarmGroup();
				isNew = true;
			}
			alarmGroup.setName(jaAlarmGroup.getString(1));
			alarmGroup.setFtype(queryType);
			alarmGroup.setListQuery(query);
			alarmGroup.setSubject(subject);
			if(isNew)
				alarmGroupDomainService.addAlarmGroup(alarmGroup);
			else
				alarmGroupDomainService.editAlarmGroup(alarmGroup);
			// 报警规则,规则在分组下,处理起来很简单
			JSONArray jaAlarmFormulas = JSONArray.fromObject( jaAlarmGroup.getString(3));
			for(int m = 0;m<jaAlarmFormulas.size();m++){
				JSONArray jaAlarmFormula = JSONArray.fromObject( jaAlarmFormulas.getString(m));
				String alarmFormlulaId = jaAlarmFormula.getString(0); 
				AlarmFormulas formula = alarmDomainService.getAlarmFormulaByAlarmId(alarmFormlulaId);
				if(formula == null){
					formula = new AlarmFormulas();
					//formula.setId(alarmFormlulaId);
				}
				formula.setName(jaAlarmFormula.getString(1).replaceFirst("^null$", ""));
				formula.setContent(jaAlarmFormula.getString(2).replaceFirst("^null$", ""));
				formula.setAlarmGroup(alarmGroup);
				formula.setBackground(jaAlarmFormula.getString(3).replaceFirst("^null$", ""));
				formula.setForeground(jaAlarmFormula.getString(4).replaceFirst("^null$", ""));
				formula.setSerial(jaAlarmFormula.getInt(5));
				formula.setIsvalid(jaAlarmFormula.getBoolean(6));
				formula.setAlarmMode(AlarmModeType.valueOf(jaAlarmFormula.getString(7)));
				formula.setAlarmColumn(jaAlarmFormula.getString(8).replaceFirst("^null$", ""));
				alarmDomainService.saveOrUpdateAlarmFormula(formula);
			}
		}

说明:

1)      我这里