mirror of
https://github.com/gristlabs/grist-core.git
synced 2024-10-27 20:44:07 +00:00
(core) Avoiding the view layout's rebuild, when nothing has changed.
Summary: Layout is rebuild when it is updated from outside, for example after saving. But actually we don't need to rebuild it, because most of the time nothing has changed. This is important for custom widgets, which will reload the iframe, even though the dom is not changed, but just moved from previous layout to the new one. Test Plan: Manual and existing. Reviewers: georgegevoian Reviewed By: georgegevoian Differential Revision: https://phab.getgrist.com/D4039
This commit is contained in:
parent
be995d4857
commit
d13a75a453
@ -53,15 +53,15 @@
|
||||
*/
|
||||
|
||||
|
||||
import dom, {detachNode, findAncestor} from '../lib/dom';
|
||||
import koArray, {isKoArray, KoArray} from '../lib/koArray';
|
||||
import {cssClass, domData, foreach, scope, style, toggleClass} from '../lib/koDom';
|
||||
import dom, {detachNode, findAncestor} from 'app/client/lib/dom';
|
||||
import koArray, {isKoArray, KoArray} from 'app/client/lib/koArray';
|
||||
import {cssClass, domData, foreach, scope, style, toggleClass} from 'app/client/lib/koDom';
|
||||
import {Disposable} from 'app/client/lib/dispose';
|
||||
import assert from 'assert';
|
||||
import {Events as BackboneEvents} from 'backbone';
|
||||
import * as ko from 'knockout';
|
||||
import {computed, isObservable, observable, utils} from 'knockout';
|
||||
import {identity, last, uniqueId} from 'underscore';
|
||||
import {identity, isEqual, last, uniqueId} from 'underscore';
|
||||
|
||||
export interface ContentBox {
|
||||
leafId: ko.Observable<any>;
|
||||
@ -457,6 +457,12 @@ export class Layout extends Disposable {
|
||||
return box;
|
||||
}
|
||||
public buildLayout(boxSpec: BoxSpec, needDynamic = false) {
|
||||
if (needDynamic === this.needDynamic &&
|
||||
this.rootBox() &&
|
||||
isEqual(boxSpec, this.getLayoutSpec())) {
|
||||
// Nothing has changed, and we already have a layout. No need to rebuild.
|
||||
return;
|
||||
}
|
||||
this.needDynamic = needDynamic;
|
||||
const oldRootBox = this.rootBox();
|
||||
this.rootBox(this.buildLayoutBox(boxSpec));
|
||||
@ -481,7 +487,8 @@ export class Layout extends Disposable {
|
||||
return spec;
|
||||
}
|
||||
public getLayoutSpec() {
|
||||
return this._getBoxSpec(this.rootBox()!);
|
||||
const rootBox = this.rootBox();
|
||||
return rootBox ? this._getBoxSpec(rootBox) : {};
|
||||
}
|
||||
/**
|
||||
* Returns a Map object mapping leafId to its LayoutBox. This gets invalidated on layoutAdjust
|
||||
|
Loading…
Reference in New Issue
Block a user