Componenten en plugins zoeken en aanroepen: FIND, COMPONENTS, SETTER, EXE, TAPI, MIDDLEWARE en ADAPT
FIND(selector, [all])geeft een component terug dat klaar is:'notice'is zijn naam,'.msg'zijn pad (het komt overeen met de paden die het bevatten) en'#id'zijn id; metalloptruegeeft het de lijst terug.COMPONENTS(path)geeft de lijst terug van de gereedstaande componenten waarvan het pad onderpathvalt; de flags van een pad filteren haar ('msg @visible').SETTER('name/method', a, b, c, d)roeptmethodaan van elk gereed component met die naam ('.path/method'voor een pad,'#id/method'voor een id,'*/method'voor alle). Een naam die nog niet geladen is, wordt eerst geladen (een lazy component).ASETTER(...)roept het niet aan: het geeft een functie terug die dat zal doen.EXE(name, a, b, c, d)(hetzelfde alsEXEC()) roept aan wat de naam zegt:'plugin/method'een methode van een plugin,'function'een globale functie, of een pad in de status dat een functie bevat ('FUNC.save').SEEX(name, value)is hetzelfde, maar als de naam geen functie is, zet het het pad opvalue.TAPI(name, data, callback)isAPI(DEF.api, ...)enPIPE(name, data, callback)isAPI(DEF.pipe, ...): twee endpointadressen die je eenmalig instelt inDEF.apienDEF.pipe.MIDDLEWARE(name, function(next) {})registreert een functie die vóór een route draait: zij moetnext()aanroepen om haar door te laten. Een route vraagt er een (of meer, gescheiden door komma's) als derde argument:ROUTE('/path/', handler, 'name').MIDDLEWARE(['a', 'b'], callback)voert de middleware in volgorde uit en daarna de callback; een dienext()niet aanroept, stopt de keten.NEWUIBIND(element, path, config)maakt vanuit de code eenui-bindop een element (het element heeft de attributen niet nodig) en geeft het terug.ADAPT(path, id, text)bereidt de tekst voor van een component dat van buiten komt: het vertaalt@(...), vervangt~PATH~enCLASSdoor het pad en~ID~door de id, en zet hetpathin de<ui-plugin>-tags die er geen hebben.COMPILEis dezelfde functie alsNOOPin jComponent 20: hij doet niets.- De objecten achter alles:
jComponent,Total,MAINenMzijn hetzelfde object (de engine:M.componentsis de lijst met componenten,M.versionde versie),Wiswindow,DEFde standaardwaarden, enREPO,FUNC,TEMPenPLUGINSzijn gewone objecten van jou:FUNCvoor functies dieEXE('FUNC.name')kan aanroepen,TEMPwordt door jComponent geleegd wanneer de pagina opnieuw begint.
NEWACTION('Math/add', {
name: 'Add two numbers',
input: '*a:Number, *b:Number',
action: function($, model) {
$.callback({ sum: model.a + model.b });
}
});exports.install = function() {
ROUTE('API /api/ +math_add --> Math/add');
ROUTE('API /pipe/ +math_add --> Math/add');
};<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>jComponent</title>
<link rel="stylesheet" href="//cdn.componentator.com/spa.min@20.css" />
<script src="//cdn.componentator.com/spa.min@20.js"></script>
</head>
<body>
<ui-component name="notice" path="msg"></ui-component>
<ui-component name="notice" path="other"></ui-component>
<ui-plugin path="shop"></ui-plugin>
<p id="target">x</p>
<script>
COMPONENT('notice', function(self) {
self.make = function() { self.element.html('<b></b>'); };
self.say = function(text, extra) { self.find('b').text(text + (extra || '')); };
});
PLUGIN('shop', function(exports) {
exports.hello = function(a) { window.shoplog = 'hello ' + a; };
});
window.globalfn = function(a, b) { window.globallog = [a, b]; };
FUNC.local = function(a) { window.funclog = a; };
DEF.api = '/api/';
DEF.pipe = '/pipe/';
</script>
</body>
</html> Probeer het in je browser
Bewerk het voorbeeld en voer het uit. Het draait in een geïsoleerd frame in je browser; er wordt niets naar onze server gestuurd.
Voorbeeld