Skip to content

Commit 7891ea6

Browse files
committed
data.Model: fields => fields_, fieldsMap, updateFieldsMap() #6248
1 parent 9cb060d commit 7891ea6

File tree

1 file changed

+36
-12
lines changed

1 file changed

+36
-12
lines changed

src/data/Model.mjs

+36-12
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ class Model extends Base {
1717
*/
1818
ntype: 'model',
1919
/**
20-
* @member {Array|null} fields=null
20+
* @member {Object[]|null} fields_=null
2121
*/
22-
fields: null,
22+
fields_: null,
2323
/**
2424
* @member {String} keyProperty_='id'
2525
*/
@@ -38,23 +38,47 @@ class Model extends Base {
3838
trackModifiedFields: false
3939
}
4040

41+
/**
42+
* @member {Map} fieldsMap=new Map()
43+
*/
44+
fieldsMap = new Map()
45+
46+
/**
47+
Triggered after the fields config got changed
48+
* @param {Object[]|null} value
49+
* @param {Object[]|null} oldValue
50+
* @protected
51+
*/
52+
afterSetFields(value, oldValue) {
53+
if (value) {
54+
this.updateFieldsMap(value)
55+
}
56+
}
57+
4158
/**
4259
* Finds a field config by a given field name
4360
* @param {String} name
4461
* @returns {Object|null} The field config object or null if no match was found
4562
*/
4663
getField(name) {
47-
let me = this,
48-
i = 0,
49-
len = me.fields?.length || 0;
50-
51-
for (; i < len; i++) {
52-
if (me.fields[i].name === name) {
53-
return me.fields[i]
54-
}
55-
}
64+
return this.fieldsMap.get(name) || null
65+
}
66+
67+
/**
68+
* @param {Object[]} fields
69+
* @param {Boolean} isRoot=true
70+
*/
71+
updateFieldsMap(fields, isRoot=true) {
72+
let {fieldsMap} = this;
73+
74+
isRoot && fieldsMap.clear();
75+
76+
fields.forEach(field => {
77+
fieldsMap.set(field.name, field);
5678

57-
return null
79+
// Assuming that nested fields contain the full path as the name, we do not need a prefix.
80+
field.fields && this.updateFieldsMap(field.fields, false)
81+
})
5882
}
5983
}
6084

0 commit comments

Comments
 (0)