Activate JS ist eine JQuery basierende Templating Engine.
Ein Control-Attribut besteht aus einem JSON-String, der ein oder mehrere Paare aus Control-Name und Control-Wert enthält {<control-name>: <control-value>, ...}. Control-Werte können von unterschiedlichem Typ sein:
Typ Control-Wert | Beispiel | Erklärung |
---|---|---|
Literal | 'some-value' | Die Zeichenkette wird so übernommen. Anwendungen sind die Definition von Template-Namen oder das Setzen von CSS-Literalen. |
Wert | true, false, 1, 2, 3 | Der Wert wird so übernommen. Anwendungen sind Parameter, For-Werte oder Bedingungen. |
Javascript-Expression | this.test == 1, !x | Der Javascript-Ausdruck wird ausgewertet und das Ergebnis übernommen. Es ist zu beachten, dass die Evaluierung vor dem Verarbeiten des Controls ausgeführt wird. Eventuell später erzeugte Werte können daher nicht zur Verfügung stehen. |
Javascript-Function | function() {this.test == 1} | Die Funktion wird erst dann evaluiert, wenn der Wert tatsächlich verwendet wird. Damit können voneinander abhängige Ausdrücke verwendet werden, wie etwa bedingte Färbung von Zeilen innerhalb eines For-Control. |
<div control="{apply: $.fn.Panel}"> <div>Header</div> <div>Content</div> </div>
Erklärung: Das Attribut "control" enthält JSON-Code, der ein oder mehrere Key-Value-Paare enthalten kann. Jeder Key ist einem Control aus $.controls zugeordnet. Im obigen Beispiel also der Key apply ruft $.controls.apply auf. This entspricht dabei dem JQuery-Element des Elements. Verwendet man die Bridge eines JQuery-Widgets, wie etwa $.fn.Panel, wird das JQuery-Widget instantiiert.
<div control="{template: 'some-panel', apply: $.fn.Panel}" style="margin-top: 10px;"> <div>Template Header</div> </div>
<div control="{applyTemplate: 'some-panel'}"> <div>Individual Content 1</div> </div>
<div control="{template: 'some-panel', apply: $.fn.Panel}" style="margin-top: 10px;"> <div>Panel Template</div> <div control="{insert: 'content'}"/> </div> <div control="{applyTemplate: 'some-panel'}"> <div control="{define: 'content'}">Individual Content 2</div> </div>
Erklärung: Das Element (div) mit dem Control applyTemplate wird durch das Template mit dem Namen "some-panel" ersetzt. Dabei werden alle Controls des Templates angewendet, zusätzlich zu den einfügenden Element.
<div control="{for: {begin: 0, end: 2, variable: 'index'}"> <label for="{prefix}:input" control="{interpolate: true}">Input {index}</label> <input control="{interpolate: true, apply: $.fn.InputText, id: 'input'}"/> </div>
<div control="{for: {begin: 0, end: 3, variable: 'x'}}"> <div control="{interpolate: true}">Iteration No. {x}</div> </div>
<form id="form"> <div control="{id: 'text'}">Some Text</div> </form>
Ergebnis: Das innere div-Element erhält das Attribut id="form:text".
Ein beliebter Kunstgriff ist, Teile der Page zunächst mit dem Style display oder visibility unsichtbar zu machen und erst nach fertiger Aktivierung anzuzeigen:
<div style="display: none;" control="{id: 'activate-test', after: {style: {display: 'block'"> ... </div> }}}
<div style="display: none;" control="{id: 'activate-test', after: {style: {display: 'block'"> ... </div> }}}
Erklärung: Es handelt sich um dasselbe Beispiel wie bei dem Control style, jedoch geht es hier um den Aspekt after. Das Control after enthält als Wert wieder eine Liste von Controls, die nach der Aktivierung der Children ausgeführt werden.
<div control="{applyTemplate: 'some-panel', set: {templateParam: 2}}"> <div control="{define: 'content'}">Individual Content 2</div> </div> <div control="{template: 'some-panel', apply: $.fn.Panel}" style="margin-top: 10px;"> <div control="{interpolate: true}">Panel Template, Parameter: {templateParam}</div> <div control="{insert: 'content'}"/> </div>
Erklärung: Der Parameter templateParam wird von der Einfügestelle applyTemplate an das Template selbst übergeben. Das heißt, jede Template-Instanz kann einen unterschiedlichen Wert erhalten.
<div control="{if: test == 2, style: {color: '#10a010'}}">Some Text</div>
Hinweis: Die If-Condition wird während des Parsens des Javascript-Code ausgeführt, was in vielen Fällen zu früh sein kann.
Um auf Ergebnisse anderer Controls zugreifen zu können, kann die Condition auch eine Funktion sein:
<div control="{if: function() {return this.test == 2}, style: {color: '#10a010'}}">Some Text</div>
<label control="{rendered: function() {this.type != 'input'}}">Input</label>
Key | Beschreibung |
---|---|
element | Das aktuelle JQuery-Element in dem der Funktionsaufruf stattfindet. |
controls | Die aktuelle Control-Struktur, die gerade abgearbeitet wird. |
control | Der aktuelle Control-Entry, der gerade verarbeitet wird. Er besteht aus key (Name) und value (function). |
root | Zugriff auf dem Root-Context. Kann für Templates und andere globale Variablen verwendet werden. |