luci-base: ui.js: add instantiateView() helper

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit d9e9cf92d1)
This commit is contained in:
Jo-Philipp Wich 2020-04-03 13:21:09 +02:00
parent c2f30fbe4d
commit a60ea6915c
2 changed files with 37 additions and 4 deletions

View file

@ -4157,6 +4157,38 @@ var UI = baseclass.extend(/** @lends LuCI.ui.prototype */ {
}, this.varargs(arguments, 2, ctx));
},
/**
* Load specified view class path and set it up.
*
* Transforms the given view path into a class name, requires it
* using [LuCI.require()]{@link LuCI#require} and asserts that the
* resulting class instance is a descendant of
* [LuCI.view]{@link LuCI.view}.
*
* By instantiating the view class, its corresponding contents are
* rendered and included into the view area. Any runtime errors are
* catched and rendered using [LuCI.error()]{@link LuCI#error}.
*
* @param {string} path
* The view path to render.
*
* @returns {Promise<LuCI.view>}
* Returns a promise resolving to the loaded view instance.
*/
instantiateView: function(path) {
var className = 'view.%s'.format(path.replace(/\//g, '.'));
return L.require(className).then(function(view) {
if (!(view instanceof View))
throw new TypeError('Loaded class %s is not a descendant of View'.format(className));
return view;
}).catch(function(err) {
dom.content(document.querySelector('#view'), null);
L.error(err);
});
},
AbstractElement: UIElement,
/* Widgets */

View file

@ -2,10 +2,11 @@
<div id="view">
<div class="spinning"><%:Loading view…%></div>
<script type="text/javascript">L.require('view.<%=view%>').catch(function(err) {
L.dom.content(document.querySelector('#view'), null);
L.error(err);
});</script>
<script type="text/javascript">
L.require('ui').then(function(ui) {
ui.instantiateView('<%=view%>');
});
</script>
</div>
<%+footer%>