Skip to content

Commit 47491fb

Browse files
committed
fix(item): sliding item events are zone wrapped
fixes #7630
1 parent 1d3d5a1 commit 47491fb

File tree

2 files changed

+18
-29
lines changed

2 files changed

+18
-29
lines changed

src/components/item/item-sliding.ts

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ChangeDetectionStrategy, Component, ContentChildren, ContentChild, Directive, ElementRef, EventEmitter, Input, Optional, Output, QueryList, Renderer, ViewEncapsulation } from '@angular/core';
1+
import { ChangeDetectionStrategy, Component, ContentChildren, ContentChild, Directive, ElementRef, EventEmitter, Input, Optional, Output, QueryList, Renderer, ViewEncapsulation, NgZone } from '@angular/core';
22

33
import { CSS, nativeRaf, nativeTimeout, clearNativeTimeout } from '../../util/dom';
44
import { Item } from './item';
@@ -40,7 +40,6 @@ export const enum ItemSideFlags {
4040
selector: 'ion-item-options',
4141
})
4242
export class ItemOptions {
43-
4443
/**
4544
* @input {string} the side the option button should be on. Defaults to right
4645
* If you have multiple `ion-item-options`, a side must be provided for each.
@@ -54,13 +53,6 @@ export class ItemOptions {
5453

5554
constructor(private _elementRef: ElementRef, private _renderer: Renderer) {}
5655

57-
/**
58-
* @private
59-
*/
60-
setCssStyle(property: string, value: string) {
61-
this._renderer.setElementStyle(this._elementRef.nativeElement, property, value);
62-
}
63-
6456
/**
6557
* @private
6658
*/
@@ -225,10 +217,14 @@ export class ItemSliding {
225217
*/
226218
@Output() ionDrag: EventEmitter<ItemSliding> = new EventEmitter<ItemSliding>();
227219

228-
constructor( @Optional() list: List, private _renderer: Renderer, private _elementRef: ElementRef) {
220+
constructor(
221+
@Optional() list: List,
222+
private _renderer: Renderer,
223+
private _elementRef: ElementRef,
224+
private _zone: NgZone) {
229225
list && list.containsSlidingItem(true);
230226
_elementRef.nativeElement.$ionComponent = this;
231-
this._setCssClass('item-wrapper', true);
227+
this.setElementClass('item-wrapper', true);
232228
}
233229

234230
@ContentChildren(ItemOptions)
@@ -341,9 +337,9 @@ export class ItemSliding {
341337
*/
342338
private fireSwipeEvent() {
343339
if (this._state & SlidingState.SwipeRight) {
344-
this._rightOptions.ionSwipe.emit(this);
340+
this._zone.run(() => this._rightOptions.ionSwipe.emit(this));
345341
} else if (this._state & SlidingState.SwipeLeft) {
346-
this._leftOptions.ionSwipe.emit(this);
342+
this._zone.run(() => this._leftOptions.ionSwipe.emit(this));
347343
}
348344
}
349345

@@ -404,18 +400,18 @@ export class ItemSliding {
404400
}
405401

406402
this.item.setElementStyle(CSS.transform, `translate3d(${-openAmount}px,0,0)`);
407-
this.ionDrag.emit(this);
403+
this._zone.run(() => this.ionDrag.emit(this));
408404
}
409405

410406
private _setState(state: SlidingState) {
411407
if (state === this._state) {
412408
return;
413409
}
414-
this._setCssClass('active-slide', (state !== SlidingState.Disabled));
415-
this._setCssClass('active-options-right', !!(state & SlidingState.Right));
416-
this._setCssClass('active-options-left', !!(state & SlidingState.Left));
417-
this._setCssClass('active-swipe-right', !!(state & SlidingState.SwipeRight));
418-
this._setCssClass('active-swipe-left', !!(state & SlidingState.SwipeLeft));
410+
this.setElementClass('active-slide', (state !== SlidingState.Disabled));
411+
this.setElementClass('active-options-right', !!(state & SlidingState.Right));
412+
this.setElementClass('active-options-left', !!(state & SlidingState.Left));
413+
this.setElementClass('active-swipe-right', !!(state & SlidingState.SwipeRight));
414+
this.setElementClass('active-swipe-left', !!(state & SlidingState.SwipeLeft));
419415
this._state = state;
420416
}
421417

@@ -461,16 +457,9 @@ export class ItemSliding {
461457
/**
462458
* @private
463459
*/
464-
_setCssClass(cssClass: string, shouldAdd: boolean) {
460+
setElementClass(cssClass: string, shouldAdd: boolean) {
465461
this._renderer.setElementClass(this._elementRef.nativeElement, cssClass, shouldAdd);
466462
}
467-
468-
/**
469-
* @private
470-
*/
471-
_setCssStyle(property: string, value: string) {
472-
this._renderer.setElementStyle(this._elementRef.nativeElement, property, value);
473-
}
474463
}
475464

476465
function shouldClose(isCloseDirection: boolean, isMovingFast: boolean, isOnCloseZone: boolean): boolean {

src/components/item/test/sliding/app-module.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,14 @@ export class E2EPage {
8787
}
8888

8989
download(item: ItemSliding) {
90-
item._setCssClass('downloading', true);
90+
item.setElementClass('downloading', true);
9191
setTimeout(() => {
9292
const toast = this.toastCtrl.create({
9393
message: 'Item was downloaded!'
9494
});
9595
toast.present();
9696

97-
item._setCssClass('downloading', false);
97+
item.setElementClass('downloading', false);
9898
item.close();
9999
setTimeout(() => {
100100
toast.dismiss();

0 commit comments

Comments
 (0)