@@ -17,9 +17,9 @@ class Model extends Base {
17
17
*/
18
18
ntype : 'model' ,
19
19
/**
20
- * @member {Array |null} fields =null
20
+ * @member {Object[] |null} fields_ =null
21
21
*/
22
- fields : null ,
22
+ fields_ : null ,
23
23
/**
24
24
* @member {String} keyProperty_='id'
25
25
*/
@@ -38,23 +38,47 @@ class Model extends Base {
38
38
trackModifiedFields : false
39
39
}
40
40
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
+
41
58
/**
42
59
* Finds a field config by a given field name
43
60
* @param {String } name
44
61
* @returns {Object|null } The field config object or null if no match was found
45
62
*/
46
63
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 ) ;
56
78
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
+ } )
58
82
}
59
83
}
60
84
0 commit comments