diff options
author | bobzel <zzzman@gmail.com> | 2019-03-08 20:22:22 -0500 |
---|---|---|
committer | bobzel <zzzman@gmail.com> | 2019-03-08 20:22:22 -0500 |
commit | 96eede5f7d1706a3f7ac6ee02a85bb3da217f467 (patch) | |
tree | a14bfc8be223e4d7927ba72396713c25c50d0fce /src/fields/ListField.ts | |
parent | 8dfc0b0e9e3dc362ddb6074467b6be4213415b1c (diff) |
diff lists to avoid rendering everything in a colletion free form view when an item is added/removed.
Diffstat (limited to 'src/fields/ListField.ts')
-rw-r--r-- | src/fields/ListField.ts | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/src/fields/ListField.ts b/src/fields/ListField.ts index 6b8773920..ce32da0a6 100644 --- a/src/fields/ListField.ts +++ b/src/fields/ListField.ts @@ -49,20 +49,6 @@ export class ListField<T extends Field> extends BasicField<T[]> { } UpdateFromServer(fields: string[]) { - if (this._proxies.length < fields.length) { - var added = true; - for (let i = 0; i < this._proxies.length; i++) { - if (this._proxies[i] != fields[i]) { - added = false; - break; - } - } - if (added) { - for (let i = this._proxies.length; i < fields.length; i++) - this._proxies.push(fields[i]); - return; - } - } this._proxies = fields; } private arraysEqual(a: any[], b: any[]) { @@ -84,7 +70,25 @@ export class ListField<T extends Field> extends BasicField<T[]> { init(callback: (field: Field) => any) { Server.GetFields(this._proxies, action((fields: { [index: string]: Field }) => { if (!this.arraysEqual(this._proxies, this.Data.map(field => field.Id))) { - this.data = this._proxies.map(id => fields[id] as T) + var dataids = this.data.map(d => d.Id); + var added = this.data.length == this._proxies.length - 1; + var deleted = this.data.length > this._proxies.length; + for (let i = 0; i < dataids.length && added; i++) + added = this._proxies.indexOf(dataids[i]) != -1; + for (let i = 0; i < this._proxies.length && deleted; i++) + deleted = dataids.indexOf(this._proxies[i]) != -1; + if (added) { // if only 1 items was added + for (let i = 0; i < this._proxies.length; i++) + if (dataids.indexOf(this._proxies[i]) === -1) + this.Data.splice(i, 0, fields[this._proxies[i]] as T); + } else if (deleted) { // if only items were deleted + for (let i = this.data.length - 1; i >= 0; i--) { + if (this._proxies.indexOf(this.data[i].Id) === -1) { + this.Data.splice(i, 1); + } + } + } else // otherwise, just rebuild the whole list + this.data = this._proxies.map(id => fields[id] as T) observe(this.Data, () => { this.updateProxies() Server.UpdateField(this); |