aurelia-onsenui
Version:
Aurelia bindings for Onsen UI
80 lines (66 loc) • 2.51 kB
JavaScript
import ons from 'onsenui';
import {Container, inject} from 'aurelia-dependency-injection';
import {DOM} from 'aurelia-pal';
import {
bindable, CompositionEngine, CompositionTransaction,
customElement, noView, ViewSlot, ViewLocator
} from 'aurelia-templating';
import {Router} from 'aurelia-router';
import {RouterView} from 'aurelia-templating-router';
export class OnsNavigator extends RouterView {
swapOrder;
layoutView;
layoutViewModel;
layoutModel;
element;
constructor(element, container, viewSlot, router, viewLocator, compositionTransaction, compositionEngine) {
super(element, container, viewSlot, router, viewLocator, compositionTransaction, compositionEngine);
this.element.pageLoader = new ons.PageLoader(this.load.bind(this), this.unload.bind(this));
this.view;
this.viewStack = [];
}
swap(viewPortInstruction) {
let router = this.router;
if (router.isNavigatingBack) {
let options = router.currentInstruction.previousInstruction.config.settings.navigator || {};
options.data = viewPortInstruction;
return this.element.popPage(options);
}
let options = router.currentInstruction.config.settings.navigator || {};
options.data = viewPortInstruction;
return this.element.pushPage(viewPortInstruction.moduleId, options);
}
load({page, parent, params}, done) {
let viewPortInstruction = params;
let previousView = this.view;
let work = () => {
let pageElement = this.view.fragment.querySelector('ons-page');
this.viewSlot.add(this.view);
if (previousView) {
this.viewStack.push(previousView);
}
this._notify();
return done(pageElement);
};
let ready = owningView => {
viewPortInstruction.controller.automate(this.overrideContext, owningView);
if (this.compositionTransactionOwnershipToken) {
return this.compositionTransactionOwnershipToken.waitForCompositionComplete().then(() => {
this.compositionTransactionOwnershipToken = null;
return work();
});
}
return work();
};
this.view = viewPortInstruction.controller.view;
return ready(this.owningView);
}
unload(pageElement) {
this.viewSlot.remove(this.view);
this.view.unbind();
this.view = this.viewStack.pop();
}
}