framework7
Version:
Full featured mobile HTML framework for building iOS & Android apps
95 lines (90 loc) • 2.97 kB
JavaScript
import Utils from '../../utils/utils';
export default {
name: 'routerComponentLoader',
proto: {
componentLoader(component, componentUrl, options = {}, resolve, reject) {
const router = this;
const { app } = router;
const url = typeof component === 'string' ? component : componentUrl;
const compiledUrl = router.replaceRequestUrlParams(url, options);
function compile(componentOptions) {
let context = options.context || {};
if (typeof context === 'function') context = context.call(router);
else if (typeof context === 'string') {
try {
context = JSON.parse(context);
} catch (err) {
reject();
throw (err);
}
}
const extendContext = Utils.merge(
{},
context,
{
$route: options.route,
$f7route: options.route,
$router: router,
$f7router: router,
$theme: {
ios: app.theme === 'ios',
md: app.theme === 'md',
aurora: app.theme === 'aurora',
},
}
);
const createdComponent = app.component.create(componentOptions, extendContext);
resolve(createdComponent.el);
}
let cachedComponent;
if (compiledUrl) {
router.cache.components.forEach((cached) => {
if (cached.url === compiledUrl) cachedComponent = cached.component;
});
}
if (compiledUrl && cachedComponent) {
compile(cachedComponent);
} else if (compiledUrl && !cachedComponent) {
// Load via XHR
if (router.xhr) {
router.xhr.abort();
router.xhr = false;
}
router
.xhrRequest(url, options)
.then((loadedComponent) => {
const parsedComponent = app.component.parse(loadedComponent);
router.cache.components.push({
url: compiledUrl,
component: parsedComponent,
});
compile(parsedComponent);
})
.catch((err) => {
reject();
throw (err);
});
} else {
compile(component);
}
},
modalComponentLoader(rootEl, component, componentUrl, options, resolve, reject) {
const router = this;
router.componentLoader(component, componentUrl, options, (el) => {
resolve(el);
}, reject);
},
tabComponentLoader(tabEl, component, componentUrl, options, resolve, reject) {
const router = this;
router.componentLoader(component, componentUrl, options, (el) => {
resolve(el);
}, reject);
},
pageComponentLoader(routerEl, component, componentUrl, options, resolve, reject) {
const router = this;
router.componentLoader(component, componentUrl, options, (el, newOptions = {}) => {
resolve(el, newOptions);
}, reject);
},
},
};