UNPKG

11.8 kBJavaScriptView Raw
1/**
2 * Module : kero dataTable row getData
3 * Author : liuyk(liuyk@yonyou.com)
4 * Date : 2016-08-08 13:54:01
5 */
6import { rowUtilFunObj } from './row-util';
7import { isArray } from 'tinper-sparrow/src/util';
8
9/**
10 * 设置对应字段的值
11 * @memberof Row
12 * @param {string} fieldName 需要设置的字段
13 * @param {string} value 需要设置的值
14 * @param {*} [ctx] 自定义属性,在valuechange监听传入对象中可通过ctx获取此处设置
15 * @example
16 * row.setValue('filed1','value1') // 设置字段值
17 * row.setValue('filed1','value1','ctx') //设置字段值,同时传入自定义数据
18 */
19var setValue = function setValue(fieldName, value, ctx, options) {
20
21 if (arguments.length === 1) {
22 value = fieldName;
23 fieldName = '$data';
24 }
25 var oldValue = this.getValue(fieldName);
26 if (typeof oldValue == 'undefined' || oldValue === null) oldValue = '';
27 if (rowUtilFunObj.eq(oldValue, value)) return;
28 var event = {
29 eventType: 'dataTableEvent',
30 dataTable: this.parent.id,
31 rowId: this.rowId,
32 field: fieldName,
33 oldValue: oldValue,
34 newValue: value,
35 ctx: ctx || ""
36 };
37 var flag = this.parent.triggerReturn(DataTable.ON_BEFORE_VALUE_CHANGE, event);
38 if (!flag) {
39 rowUtilFunObj._triggerChange(this, fieldName, oldValue, ctx);
40 return;
41 }
42 rowUtilFunObj._getField(this, fieldName)['value'] = value;
43 rowUtilFunObj._triggerChange(this, fieldName, oldValue, ctx);
44};
45
46// 设置字表值,fieldName通过.分隔
47var setChildValue = function setChildValue(fieldName, value) {
48 var nameArr = fieldName.split('.');
49 var _name = nameArr[0];
50 var _field = this.data[_name]; //_field保存当前_name对应的数据
51 for (var i = 0, count = nameArr.length; i < count; i++) {
52 //最后一级
53 if (i == count - 1) {
54 if (_field['value'] instanceof u.DataTable) {
55 //暂不处理
56 } else {
57 this.setValue(fieldName, value);
58 }
59 } else {
60 if (_field && _field['value'] instanceof u.DataTable) {
61 var row = _field['value'].getCurrentRow();
62 if (row) row.setChildValue(fieldName.replace(_name + '.', ''), value);
63 } else {
64 _name = nameArr[i + 1];
65 _field = _field[_name]; //多层嵌套时_field取子项对应的数据
66 }
67 }
68 }
69};
70
71// 通过rowid设置字表数据信息
72var setChildSimpleDataByRowId = function setChildSimpleDataByRowId(rowId, data) {
73 var rowIdArr = rowId.split('.');
74 var rowIdLength = rowIdArr.length;
75 if (rowIdLength > 1) {
76 var _childField = rowIdArr[0]; //子表字段
77 var _childObj = this.data[_childField]; // 子表字段存放的obj
78 if (_childObj && _childObj['value'] instanceof u.DataTable) {
79 var rowId = rowIdArr[1];
80 var row = null;
81 if (rowId) row = _childObj['value'].getRowByRowId(rowId);
82 if (row) {
83 if (rowIdArr.length == 2) {
84 row.setSimpleData(data);
85 } else {
86 row.setChildSimpleDataByRowId(fieldName.replace(_childField + '.' + rowId + '.', ''), data);
87 }
88 }
89 }
90 }
91};
92
93/***
94 * 设置数据的核心方法
95 * @param {u.Row} rowObj Row对象
96 * @param {object} sourceData 源对象
97 * @param {object} targetData 目标对象
98 * @param {boolean} subscribe 是否触发监听,true表示触发监听
99 * @param {string} parentKey datatable的id
100 * @param {object} options 设置数据信息是的配置参数
101 * @param {boolean} options.fieldFlag 未设置的meta是否进行存储,如果为true则未设置的meta也进行存储
102 */
103var _setData = function _setData(rowObj, sourceData, targetData, subscribe, parentKey, options) {
104 for (var key in sourceData) {
105
106 // 判断是否要放到dataTable中
107 if (options && !options.fieldFlag) {
108 if (!rowObj.parent.getMeta(key)) {
109 continue;
110 }
111 }
112 var _parentKey = parentKey || null;
113 //if (targetData[key]) {
114 targetData[key] = targetData[key] || {};
115 var valueObj = sourceData[key];
116
117 // if (typeof valueObj != 'object'){
118 // if(typeof options == 'object'){
119 // if(options.fieldFlag) {
120 // rowObj.parent.createField(key);
121 // }
122 // }
123 // }
124
125 //if (typeof this.parent.meta[key] === 'undefined') continue;
126 if (valueObj == null || (typeof valueObj === 'undefined' ? 'undefined' : babelHelpers['typeof'](valueObj)) != 'object') {
127 // 子表的话只有valueObj为datatable的时候才赋值
128 if (!targetData[key].isChild) {
129 targetData[key]['value'] = rowObj.formatValue(key, valueObj);
130 }
131 if (subscribe === true && oldValue !== targetData[key]['value']) {
132 rowUtilFunObj._triggerChange(rowObj, key, oldValue);
133 }
134 } else {
135 if (valueObj.error) {
136 if (u.showMessageDialog) u.showMessageDialog({
137 title: "警告",
138 msg: valueObj.error,
139 backdrop: true
140 });else alert(valueObj.error);
141 } else if (valueObj.value || valueObj.value === null || valueObj.meta || valueObj.value === '' || valueObj.value === '0' || valueObj.value === 0) {
142 var oldValue = targetData[key]['value'];
143 targetData[key]['value'] = rowObj.formatValue(key, valueObj.value);
144 if (subscribe === true && oldValue !== targetData[key]['value']) {
145 rowUtilFunObj._triggerChange(rowObj, key, oldValue);
146 }
147 for (var k in valueObj.meta) {
148 rowObj.setMeta(key, k, valueObj.meta[k]);
149 }
150 } else if (isArray(valueObj)) {
151 targetData[key].isChild = true;
152 //ns 是多级数据时的空间名: 最顶层的dataTable没有ns。 f1.f2.f3
153 var _key = _parentKey == null ? key : _parentKey + '.' + key;
154 var ns = rowObj.parent.ns === '' ? key : rowObj.parent.ns + '.' + _key;
155 if (rowObj.parent.meta[_key]) {
156 var meta = rowObj.parent.meta[_key]['meta'];
157 targetData[key].value = new u.DataTable({
158 root: rowObj.parent.root,
159 ns: ns,
160 meta: meta
161 });
162 targetData[key].value.setSimpleData(valueObj);
163 }
164 } else {
165 _parentKey = _parentKey == null ? key : _parentKey + '.' + key;
166 _setData(rowObj, valueObj, targetData[key], null, _parentKey, options);
167 }
168 }
169 //}
170 }
171};
172
173/**
174 * 设置row的数据信息
175 * @memberof Row
176 * @param {object} data 需要设置的配置信息
177 * @param {boolean} [subscribe] 是否触发监听,true表示触发监听
178 * @param {object} [options] 设置数据信息是的配置参数
179 * @param {boolean} [options.fieldFlag] 未设置的meta是否进行存储,如果为true则未设置的meta也进行存储
180 * @example
181 * var data = {
182 * data:{
183 * filed1:'value1',
184 * field2:'value2'
185 * }
186 * }
187 * row.setData(data)
188 * row.setData(data,false)
189 * row.setData(data),false,{fieldFlag:true})
190 */
191var setData = function setData(data, subscribe, options) {
192 var sourceData = data.data,
193 targetData = this.data;
194 if (this.parent.root.strict != true) {
195 _setData(this, sourceData, targetData, subscribe, null, options);
196 this.setStatus(data.status);
197 return;
198 }
199
200 // strict 为true 时 ,定义dataTable的时候必须定义所有字段信息才能设置数据。
201 var meta = this.parent.meta;
202 for (var key in meta) {
203 var oldValue = newValue = null;
204 //子数据
205 if (meta[key]['type'] && meta[key]['type'] === 'child') {
206 targetData[key].isChild = true;
207 //ns 是多级数据时的空间名: 最顶层的dataTable没有ns。 f1.f2.f3
208 var ns = this.parent.ns === '' ? key : this.parent.ns + '.' + key;
209 var meta = this.parent.meta[key]['meta'];
210 targetData[key].value = new u.DataTable({
211 root: this.parent.root,
212 ns: ns,
213 meta: meta
214 });
215 if (babelHelpers['typeof'](sourceData[key]) === 'object') targetData[key].value.setSimpleData(sourceData[key]);
216 }
217 //存在多级关系
218 else if (key.indexOf('.') != -1) {
219 var keys = key.split('.');
220 var _fieldValue = sourceData;
221 var _targetField = targetData;
222 for (var i = 0; i < keys.length; i++) {
223 _fieldValue = _fieldValue || {};
224 _fieldValue = _fieldValue[keys[i]];
225 _targetField = _targetField[keys[i]];
226 }
227 oldValue = _targetField['value'];
228 _targetField['value'] = this.formatValue(key, _fieldValue);
229 newValue = _targetField['value'];
230 }
231 // 通过 setSimpleData 设置的数据
232 else if (sourceData[key] == null || babelHelpers['typeof'](sourceData[key]) != 'object') {
233 oldValue = targetData[key]['value'];
234 targetData[key]['value'] = this.formatValue(key, sourceData[key]);
235 newValue = targetData[key]['value'];
236 } else {
237 var valueObj = sourceData[key];
238 if (valueObj.error) {
239 if (u.showMessageDialog) u.showMessageDialog({
240 title: "警告",
241 msg: valueObj.error,
242 backdrop: true
243 });else alert(valueObj.error);
244 } else if (valueObj.value || valueObj.value === null || valueObj.meta) {
245 oldValue = targetData[key]['value'];
246 targetData[key]['value'] = this.formatValue(key, valueObj.value);
247 newValue = targetData[key]['value'];
248 for (var k in valueObj.meta) {
249 this.setMeta(key, k, valueObj.meta[k]);
250 }
251 }
252 }
253 if (subscribe === true && oldValue !== newValue) {
254 rowUtilFunObj._triggerChange(this, key, oldValue);
255 }
256 }
257};
258
259// 效果同setData
260var updateRow = function updateRow(row) {
261 this.setData(row);
262};
263
264/**
265 * 设置row的status属性
266 * @memberof Row
267 * @param {string} status 需要设置的status
268 * @example
269 * row.setStatus(Row.STATUS.NORMAL)
270 */
271var setStatus = function setStatus(status) {
272 this.status = status;
273 if (status == Row.STATUS.NORMAL) {
274 // 保存baseValue,用于重置
275 var data = this.data;
276 for (var field in data) {
277 var value = data[field].value;
278 data[field].baseValue = value;
279 }
280 }
281};
282
283/**
284 * 重置数据至nrm状态时的数据
285 * @example
286 * row.resetValue()
287 */
288var resetValue = function resetValue() {
289 var data = this.data;
290 for (var field in data) {
291 var value = data[field].baseValue;
292 this.setValue(field, value);
293 }
294};
295
296export var rowDataFunObj = {
297 setValue: setValue,
298 setChildValue: setChildValue,
299 setChildSimpleDataByRowId: setChildSimpleDataByRowId,
300 setData: setData,
301 updateRow: updateRow,
302 setStatus: setStatus,
303 resetValue: resetValue
304};
\No newline at end of file