diff --git a/packages/core/src/components/datetime/datetime.tsx b/packages/core/src/components/datetime/datetime.tsx index 52f69d3934..361473c2dc 100644 --- a/packages/core/src/components/datetime/datetime.tsx +++ b/packages/core/src/components/datetime/datetime.tsx @@ -232,15 +232,18 @@ export class Datetime { // If the user has not passed in picker buttons, // add a cancel and ok button to the picker - if (pickerOptions.buttons.length === 0) { - pickerOptions.buttons = [{ - text: this.cancelText, - role: 'cancel', - handler: () => this.ionCancel.emit(this) - }, { - text: this.doneText, - handler: (data: any) => this.value = data, - }]; + const buttons = pickerOptions.buttons; + if (!buttons || buttons.length === 0) { + pickerOptions.buttons = [ + { + text: this.cancelText, + role: 'cancel', + handler: () => this.ionCancel.emit(this) + }, + { + text: this.doneText, + handler: (data: any) => this.value = data, + }]; } pickerOptions.columns = this.generateColumns(); diff --git a/packages/core/src/components/fab-button/fab-button.tsx b/packages/core/src/components/fab-button/fab-button.tsx index 7ec2734692..6989b57ddf 100755 --- a/packages/core/src/components/fab-button/fab-button.tsx +++ b/packages/core/src/components/fab-button/fab-button.tsx @@ -52,10 +52,11 @@ export class FabButton { @Prop() disabled = false; componentDidLoad() { - const parentNode = this.el.parentNode.nodeName; + const parentNode = this.el.parentNode; + const parentTag = parentNode ? parentNode.nodeName : null; - this.inList = (parentNode === 'ION-FAB-LIST'); - this.inContainer = (parentNode === 'ION-FAB'); + this.inList = (parentTag === 'ION-FAB-LIST'); + this.inContainer = (parentTag === 'ION-FAB'); } diff --git a/packages/core/src/components/gesture-controller/gesture-controller.ts b/packages/core/src/components/gesture-controller/gesture-controller.ts index 5e74258819..bf4d3a7ad5 100644 --- a/packages/core/src/components/gesture-controller/gesture-controller.ts +++ b/packages/core/src/components/gesture-controller/gesture-controller.ts @@ -125,14 +125,17 @@ export class GestureController { export class GestureDelegate { + private ctrl: GestureController|null; constructor( - private ctrl: GestureController, + ctrl: GestureController, private gestureDelegateId: number, private name: string, private priority: number, private disableScroll: boolean - ) { } + ) { + this.ctrl = ctrl; + } canStart(): boolean { if (!this.ctrl) { @@ -185,47 +188,51 @@ export class BlockerDelegate { blocked = false; + private ctrl: GestureController|null; + constructor( private blockerDelegateId: number, - private controller: GestureController, - private disable: string[], + ctrl: GestureController, + private disable: string[] | undefined, private disableScroll: boolean - ) { } + ) { + this.ctrl = ctrl; + } block() { - if (!this.controller) { + if (!this.ctrl) { return; } if (this.disable) { - this.disable.forEach(gesture => { - this.controller.disableGesture(gesture, this.blockerDelegateId); - }); + for (const gesture of this.disable) { + this.ctrl.disableGesture(gesture, this.blockerDelegateId); + } } if (this.disableScroll) { - this.controller.disableScroll(this.blockerDelegateId); + this.ctrl.disableScroll(this.blockerDelegateId); } this.blocked = true; } unblock() { - if (!this.controller) { + if (!this.ctrl) { return; } if (this.disable) { - this.disable.forEach(gesture => { - this.controller.enableGesture(gesture, this.blockerDelegateId); - }); + for (const gesture of this.disable) { + this.ctrl.enableGesture(gesture, this.blockerDelegateId); + } } if (this.disableScroll) { - this.controller.enableScroll(this.blockerDelegateId); + this.ctrl.enableScroll(this.blockerDelegateId); } this.blocked = false; } destroy() { this.unblock(); - this.controller = null; + this.ctrl = null; } } diff --git a/packages/core/src/components/gesture/recognizers.ts b/packages/core/src/components/gesture/recognizers.ts index 8553c342b3..9b7622fafb 100644 --- a/packages/core/src/components/gesture/recognizers.ts +++ b/packages/core/src/components/gesture/recognizers.ts @@ -1,5 +1,4 @@ - export class PanRecognizer { private startX: number; private startY: number; diff --git a/packages/core/src/components/infinite-scroll/infinite-scroll.tsx b/packages/core/src/components/infinite-scroll/infinite-scroll.tsx index 80a1761bce..bc1f665f28 100644 --- a/packages/core/src/components/infinite-scroll/infinite-scroll.tsx +++ b/packages/core/src/components/infinite-scroll/infinite-scroll.tsx @@ -104,7 +104,7 @@ export class InfiniteScroll { this.thresholdChanged(this.threshold); this.enableScrollEvents(!this.disabled); if (this.position === Position.Top) { - this.dom.write(() => this.scrollEl.scrollToBottom(0)); + this.dom.write(() => this.scrollEl && this.scrollEl.scrollToBottom(0)); } } @@ -114,8 +114,9 @@ export class InfiniteScroll { @Listen('ionScroll', {enabled: false}) protected onScroll(ev: CustomEvent) { + const scrollEl = this.scrollEl; const detail = ev.detail as ScrollDetail; - if (!this.canStart()) { + if (!scrollEl || !this.canStart()) { return 1; } @@ -125,8 +126,8 @@ export class InfiniteScroll { return 2; } const scrollTop = detail.scrollTop; - const scrollHeight = this.scrollEl.scrollHeight; - const height = this.scrollEl.offsetHeight; + const scrollHeight = scrollEl.scrollHeight; + const height = scrollEl.offsetHeight; const threshold = this.thrPc ? (height * this.thrPc) : this.thrPx; const distanceFromInfinite = (this.position === Position.Bottom) @@ -159,7 +160,8 @@ export class InfiniteScroll { */ @Method() complete() { - if (!this.isLoading) { + const scrollEl = this.scrollEl; + if (!this.isLoading || !scrollEl) { return; } this.isLoading = false; @@ -187,18 +189,18 @@ export class InfiniteScroll { this.isBusy = true; // ******** DOM READ **************** // Save the current content dimensions before the UI updates - const prev = this.scrollEl.scrollHeight - this.scrollEl.scrollTop; + const prev = scrollEl.scrollHeight - scrollEl.scrollTop; // ******** DOM READ **************** this.dom.read(() => { // UI has updated, save the new content dimensions - const scrollHeight = this.scrollEl.scrollHeight; + const scrollHeight = scrollEl.scrollHeight; // New content was added on top, so the scroll position should be changed immediately to prevent it from jumping around const newScrollTop = scrollHeight - prev; // ******** DOM WRITE **************** this.dom.write(() => { - this.scrollEl.scrollTop = newScrollTop; + scrollEl.scrollTop = newScrollTop; this.isBusy = false; }); }); @@ -224,7 +226,9 @@ export class InfiniteScroll { } private enableScrollEvents(shouldListen: boolean) { - this.enableListener(this, 'ionScroll', shouldListen, this.scrollEl); + if (this.scrollEl) { + this.enableListener(this, 'ionScroll', shouldListen, this.scrollEl); + } } hostData() { diff --git a/packages/core/src/components/input/input.tsx b/packages/core/src/components/input/input.tsx index e549c37fd8..e3eb5f8bcd 100644 --- a/packages/core/src/components/input/input.tsx +++ b/packages/core/src/components/input/input.tsx @@ -204,7 +204,7 @@ export class Input implements InputComponent { @Watch('value') protected valueChanged() { const inputEl = this.el.querySelector('input'); - if (inputEl.value !== this.value) { + if (inputEl && inputEl.value !== this.value) { inputEl.value = this.value; } } diff --git a/packages/core/src/components/router-controller/router-utils.ts b/packages/core/src/components/router-controller/router-utils.ts index 16e482adf4..724f36a291 100644 --- a/packages/core/src/components/router-controller/router-utils.ts +++ b/packages/core/src/components/router-controller/router-utils.ts @@ -11,7 +11,7 @@ export interface NavElement extends HTMLElement { export interface RouterEntry { path: string; id: any; - segments: string[]; + segments?: string[]; props?: any; }