Trouver et appeler composants et plugins : FIND, COMPONENTS, SETTER, EXE, TAPI, MIDDLEWARE et ADAPT
FIND(selector, [all])renvoie un composant prêt :'notice'est son nom,'.msg'son chemin (il correspond aux chemins qui le contiennent) et'#id'son id ; avecallàtrueil renvoie la liste.COMPONENTS(path)renvoie la liste des composants prêts dont le chemin est souspath; les drapeaux d'un chemin la filtrent ('msg @visible').SETTER('name/method', a, b, c, d)appellemethodde chaque composant prêt portant ce nom ('.path/method'pour un chemin,'#id/method'pour un id,'*/method'pour tous). Un nom qui n'est pas encore chargé est d'abord chargé (un composant paresseux).ASETTER(...)ne l'appelle pas : il renvoie une fonction qui le fera.EXE(name, a, b, c, d)(commeEXEC()) appelle ce que dit le nom :'plugin/method'une méthode d'un plugin,'function'une fonction globale, ou un chemin de l'état qui contient une fonction ('FUNC.save').SEEX(name, value)est pareil, mais quand le nom n'est pas une fonction il met le chemin àvalue.TAPI(name, data, callback)estAPI(DEF.api, ...)etPIPE(name, data, callback)estAPI(DEF.pipe, ...): deux adresses de points de terminaison que vous définissez une fois dansDEF.apietDEF.pipe.MIDDLEWARE(name, function(next) {})enregistre une fonction qui s'exécute avant une route : elle doit appelernext()pour la laisser continuer. Une route en demande une (ou plusieurs, séparées par des virgules) comme troisième argument :ROUTE('/path/', handler, 'name').MIDDLEWARE(['a', 'b'], callback)exécute les middlewares dans l'ordre puis le callback ; un middleware qui n'appelle pasnext()arrête la chaîne.NEWUIBIND(element, path, config)crée unui-bindsur un élément depuis le code (l'élément n'a pas besoin des attributs) et le renvoie.ADAPT(path, id, text)prépare le texte d'un composant venu de l'extérieur : il traduit@(...), remplace~PATH~etCLASSpar le chemin et~ID~par l'id, et met lepathdans les balises<ui-plugin>qui n'en ont pas.COMPILEest la même fonction queNOOPdans jComponent 20 : elle ne fait rien.- Les objets derrière tout :
jComponent,Total,MAINetMsont le même objet (le moteur :M.componentsest la liste des composants,M.versionla version),Westwindow,DEFles valeurs par défaut, etREPO,FUNC,TEMPetPLUGINSsont des objets simples à vous :FUNCpour les fonctions queEXE('FUNC.name')peut appeler,TEMPest vidé par jComponent quand la page redémarre.
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> Essayez-le dans votre navigateur
Modifiez l'exemple et exécutez-le. Il s'exécute dans un cadre isolé de votre navigateur ; rien n'est envoyé à notre serveur.
Aperçu