fix(itemSliding): close items when scrolling content

This commit is contained in:
Adam Bradley
2015-11-16 13:35:20 -06:00
parent b5fc40be92
commit b7c2291dd7
5 changed files with 49 additions and 10 deletions

View File

@ -73,15 +73,16 @@ export class Content extends Ion {
} }
onScrollEnd(callback) { onScrollEnd(callback) {
let timerId; let timerId, deregister;
function debounce() { function debounce() {
timerId = setTimeout(() => { timerId = setTimeout(() => {
deregister();
callback();
}, 250); }, 250);
} }
this.addScrollEventListener(debounce); deregister = this.addScrollEventListener(debounce);
} }
/** /**

View File

@ -9,7 +9,7 @@ export class ItemSlidingGesture extends DragGesture {
constructor(list: List, listEle) { constructor(list: List, listEle) {
super(listEle, { super(listEle, {
direction: 'x', direction: 'x',
threshold: 40 threshold: DRAG_THRESHOLD
}); });
this.data = {}; this.data = {};
@ -24,7 +24,7 @@ export class ItemSlidingGesture extends DragGesture {
if (!isFromOptionButtons(ev.target)) { if (!isFromOptionButtons(ev.target)) {
let didClose = this.closeOpened(); let didClose = this.closeOpened();
if (didClose) { if (didClose) {
ev.preventDefault(); preventDefault(ev);
} }
} }
}); });
@ -46,7 +46,7 @@ export class ItemSlidingGesture extends DragGesture {
if (this.preventDrag) { if (this.preventDrag) {
this.closeOpened(ev); this.closeOpened(ev);
return ev.preventDefault(); return preventDefault(ev);
} }
itemContainerEle.classList.add('active-slide'); itemContainerEle.classList.add('active-slide');
@ -60,6 +60,11 @@ export class ItemSlidingGesture extends DragGesture {
} }
onDrag(ev) { onDrag(ev) {
if (Math.abs(ev.deltaY) > 30) {
this.preventDrag = true;
return this.closeOpened(ev);
}
let itemContainerEle = getItemConatiner(ev.target); let itemContainerEle = getItemConatiner(ev.target);
if (!itemContainerEle || !isActive(itemContainerEle) || this.preventDrag) return; if (!itemContainerEle || !isActive(itemContainerEle) || this.preventDrag) return;
@ -142,7 +147,7 @@ export class ItemSlidingGesture extends DragGesture {
clearTimeout(this.get(itemContainerEle).timerId); clearTimeout(this.get(itemContainerEle).timerId);
if (openAmount > 0) { if (openAmount) {
this.openItems++; this.openItems++;
} else { } else {
@ -157,7 +162,11 @@ export class ItemSlidingGesture extends DragGesture {
} }
slidingEle.style[CSS.transition] = (isFinal ? '' : 'none'); slidingEle.style[CSS.transition] = (isFinal ? '' : 'none');
slidingEle.style[CSS.transform] = (openAmount === 0 ? '' : 'translate3d(' + -openAmount + 'px,0,0)'); slidingEle.style[CSS.transform] = (openAmount ? 'translate3d(' + -openAmount + 'px,0,0)' : '');
if (isFinal) {
this.enableScroll(!openAmount);
}
} }
getOpenAmount(itemContainerEle) { getOpenAmount(itemContainerEle) {
@ -175,12 +184,23 @@ export class ItemSlidingGesture extends DragGesture {
this.data[itemContainerEle.$ionSlide][key] = value; this.data[itemContainerEle.$ionSlide][key] = value;
} }
enableScroll(shouldEnable) {
let scrollContentEle = closest(this.listEle, 'scroll-content');
if (scrollContentEle) {
scrollContentEle[shouldEnable ? 'removeEventListener' : 'addEventListener']('touchstart', preventDefault);
}
}
unlisten() { unlisten() {
super.unlisten(); super.unlisten();
this.listEle = null; this.listEle = null;
} }
} }
function preventDefault(ev) {
ev.preventDefault();
}
function getItemConatiner(ele) { function getItemConatiner(ele) {
return closest(ele, 'ion-item-sliding', true); return closest(ele, 'ion-item-sliding', true);
} }
@ -199,3 +219,6 @@ function getOptionsWidth(itemContainerEle) {
function isActive(itemContainerEle) { function isActive(itemContainerEle) {
return itemContainerEle.classList.contains('active-slide'); return itemContainerEle.classList.contains('active-slide');
} }
const DRAG_THRESHOLD = 20;

View File

@ -16,7 +16,11 @@ class E2EApp {
} }
getItems() { getItems() {
return [0,1]; let items = [];
for (let x = 0; x < 20; x++) {
items.push(x);
}
return items;
} }
didClick(ev, item) { didClick(ev, item) {
@ -32,4 +36,8 @@ class E2EApp {
console.log('Delete', ev, item); console.log('Delete', ev, item);
item.close(); item.close();
} }
reload() {
window.location.reload();
}
} }

View File

@ -1,4 +1,9 @@
<ion-toolbar><ion-title>Sliding Items</ion-title></ion-toolbar> <ion-toolbar>
<ion-title>Sliding Items</ion-title>
<ion-nav-items secondary>
<button (click)="reload()">Reload</button>
</ion-nav-items>
</ion-toolbar>
<ion-content> <ion-content>

View File

@ -29,6 +29,8 @@ export class DragGesture extends Gesture {
this.onDragEnd(ev); this.onDragEnd(ev);
this.dragging = false; this.dragging = false;
}); });
this.hammertime.get('pan').set(this._options);
} }
onDrag() {} onDrag() {}