kero
Version:
211 lines (199 loc) • 8 kB
JavaScript
/**
* Module : kero dataTable row getData
* Author : liuyk(liuyk@yonyou.com)
* Date : 2016-08-08 13:54:01
*/
import {eq,_triggerChange, _getField} from './row-util';
import {isArray} from 'neoui-sparrow/js/util';
/**
*设置row中某一列的值
*/
const setValue = function (fieldName, value, ctx, options) {
if (arguments.length === 1){
value = fieldName;
fieldName = '$data';
}
var oldValue = this.getValue(fieldName)
if(typeof oldValue == 'undefined' || oldValue === null)
oldValue = ''
if (eq(oldValue, value)) return;
_getField(this, fieldName)['value'] = value;
_triggerChange(this, fieldName, oldValue, ctx);
}
const setChildValue = function(fieldName, value){
var nameArr = fieldName.split('.');
var _name = nameArr[0];
var _field = this.data[_name];//_field保存当前_name对应的数据
for (var i = 0, count = nameArr.length; i<count; i++){
//最后一级
if (i == count -1){
if (_field['value'] instanceof u.DataTable){
//暂不处理
}else{
this.setValue(fieldName, value);
}
}else{
if (_field && _field['value'] instanceof u.DataTable){
var row = _field['value'].getCurrentRow();
if (row)
row.setChildValue(fieldName.replace(_name + '.', ''), value)
}else{
_name = nameArr[i + 1];
_field = _field[_name];//多层嵌套时_field取子项对应的数据
}
}
}
};
const setChildSimpleDataByRowId = function(rowId, data){
var rowIdArr = rowId.split('.');
var rowIdLength = rowIdArr.length;
if(rowIdLength > 1){
var _childField = rowIdArr[0]; //子表字段
var _childObj = this.data[_childField]; // 子表字段存放的obj
if (_childObj && _childObj['value'] instanceof u.DataTable){
var rowId = rowIdArr[1];
var row = null;
if(rowId)
row = _childObj['value'].getRowByRowId(rowId);
if (row){
if(rowIdArr.length == 2){
row.setSimpleData(data);
}else{
row.setChildSimpleDataByRowId(fieldName.replace(_childField + '.' + rowId + '.', ''),data)
}
}
}
}
}
/**
* [_setData description]
* @param {[type]} sourceData
* @param {[type]} targetData
* @param {[type]} subscribe
* @param {[type]} parentKey [父项key,数据项为数组时获取meta值用]
*/
const _setData = function(rowObj, sourceData, targetData, subscribe, parentKey){
for (var key in sourceData) {
var _parentKey = parentKey || null;
//if (targetData[key]) {
targetData[key] = targetData[key] || {};
var valueObj = sourceData[key]
if (typeof valueObj != 'object')
rowObj.parent.createField(key);
//if (typeof this.parent.meta[key] === 'undefined') continue;
if (valueObj == null || typeof valueObj != 'object'){
targetData[key]['value'] = rowObj.formatValue(key, valueObj)
if (subscribe === true && (oldValue !== targetData[key]['value'])){
_triggerChange(rowObj, key, oldValue);
}
}
else {
if (valueObj.error) {
if(u.showMessageDialog)
u.showMessageDialog({title: "警告", msg: valueObj.error, backdrop: true});
else
alert(valueObj.error);
} else if (valueObj.value || valueObj.value === null || valueObj.meta || valueObj.value === '' || valueObj.value === '0' || valueObj.value === 0){
var oldValue = targetData[key]['value'];
targetData[key]['value'] = rowObj.formatValue(key, valueObj.value)
if (subscribe === true && (oldValue !== targetData[key]['value'])){
_triggerChange(rowObj, key, oldValue);
}
for (var k in valueObj.meta) {
rowObj.setMeta(key, k, valueObj.meta[k])
}
}else if (isArray(valueObj)){
targetData[key].isChild = true;
//ns 是多级数据时的空间名: 最顶层的dataTable没有ns。 f1.f2.f3
var _key = _parentKey == null ? key : _parentKey + '.' + key;
var ns = rowObj.parent.ns === '' ? key : rowObj.parent.ns + '.' + _key
if(rowObj.parent.meta[_key]){
var meta = rowObj.parent.meta[_key]['meta']
targetData[key].value = new u.DataTable({root:rowObj.parent.root,ns:ns,meta:meta});
targetData[key].value.setSimpleData(valueObj);
}
}else{
_parentKey = _parentKey == null ? key : _parentKey + '.' + key;
_setData(rowObj, valueObj, targetData[key], null, _parentKey);
}
}
//}
}
}
/**
*设置Row数据
*@subscribe 是否触发监听
*/
const setData = function (data, subscribe) {
this.status = data.status
var sourceData = data.data,
targetData = this.data;
if (this.parent.root.strict != true){
_setData(this, sourceData, targetData,subscribe);
return;
}
// strict 为true 时 ,定义dataTable的时候必须定义所有字段信息才能设置数据。
var meta = this.parent.meta;
for (var key in meta){
var oldValue = newValue = null;
//子数据
if (meta[key]['type'] && meta[key]['type'] === 'child'){
targetData[key].isChild = true;
//ns 是多级数据时的空间名: 最顶层的dataTable没有ns。 f1.f2.f3
var ns = this.parent.ns === '' ? key : this.parent.ns + '.' + key
var meta = this.parent.meta[key]['meta']
targetData[key].value = new u.DataTable({root:this.parent.root,ns:ns,meta:meta});
if (typeof sourceData[key] === 'object')
targetData[key].value.setSimpleData(sourceData[key]);
}
//存在多级关系
else if (key.indexOf('.') != -1){
var keys = key.split('.');
var _fieldValue = sourceData;
var _targetField = targetData;
for(var i = 0; i< keys.length; i++){
_fieldValue = _fieldValue || {};
_fieldValue = _fieldValue[keys[i]];
_targetField = _targetField[keys[i]];
}
oldValue = _targetField['value'];
_targetField['value'] = this.formatValue(key, _fieldValue)
newValue = _targetField['value'];
}
// 通过 setSimpleData 设置的数据
else if (sourceData[key] == null || typeof sourceData[key] != 'object'){
oldValue = targetData[key]['value'];
targetData[key]['value'] = this.formatValue(key, sourceData[key])
newValue = targetData[key]['value'];
}
else{
var valueObj = sourceData[key];
if (valueObj.error) {
if(u.showMessageDialog)
u.showMessageDialog({title: "警告", msg: valueObj.error, backdrop: true});
else
alert(valueObj.error);
} else if (valueObj.value || valueObj.value === null || valueObj.meta){
oldValue = targetData[key]['value'];
targetData[key]['value'] = this.formatValue(key, valueObj.value)
newValue = targetData[key]['value'];
for (var k in valueObj.meta) {
this.setMeta(key, k, valueObj.meta[k])
}
}
}
if (subscribe === true && (oldValue !== newValue)){
_triggerChange(this, key, oldValue);
}
}
};
const updateRow = function (row) {
this.setData(row)
}
export {
setValue,
setChildValue,
setChildSimpleDataByRowId,
setData,
updateRow
}