Antwort
 
Themen-Optionen
Alt 18.03.2007, 19:31 Nach oben    #1
Erfahrener Benutzer
 
Benutzerbild von Bleistift
 
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 298
Standard Javascript Template System

Vielleicht erscheint die Frage jetzt als ein bisschen blöd... Aber gibt es ein Templatesystem für Javascript? Ich kriege Daten (JSON) mit AJAX zugespielt und stelle die dar. Aber als MVC-Freak würde ich alles gerne trennen. Hat jemand eine Idee, oder muss ich selber etwas basteln?
//EDIT: Habe gerade http://amix.dk/blog/viewEntry/?id=161 gefunden. Aber so wirklich gefallen tut es mir nicht. Ist irgendwie etwas à la printf("...", bla);
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination.

Geändert von Bleistift (18.03.2007 um 19:39 Uhr).
Bleistift ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.03.2007, 14:38 Nach oben    #2
Ben
Benjamin Klaile
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.480
Standard

Ich muss gestehen, dass ich nicht genau weiß, worauf du hinaus willst.

Du willst das "Laden" der Daten von der Ausgabe trennen. Okay. Reicht da nicht einfach eine simple Funktion/Methode oder ist das bei dir so komplex, dass man da wirklich etwas "Template-Engine"-mäßiges für braucht?
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.03.2007, 16:11 Nach oben    #3
Erfahrener Benutzer
 
Benutzerbild von Bleistift
 
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 298
Standard

Also ganz konkret: Ich hab ein JS-File das ca. so aussieht:
Javascript Code:
  1. for(i=0;i<files.length;i++) {
  2.     var tdclass = 'td1';
  3.     if(i % 2 == 0)
  4.         tdclass = 'td2';
  5.     temp_html += '<tr style="height: 65px;" onclick="Filemanager_Details.show(\''+json&#91;'path'&#93;+'\',\''+files&#91;i&#93;.name+'\');">\n';
  6.     //...
  7. }
  8. $("browser").innerHTML = temp_html;
Nun gefällt mir aber das gebastelt mir temp_html nicht so. Erinnert mich an meine ersten Schritte in PHP. Weil mich das schon in PHP störte, stieg ich auf Smarty um. Jetzt suche ich etwas ähnliches für JS.
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination.
Bleistift ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.03.2007, 16:47 Nach oben    #4
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 521
Standard

in meiner scriptsammlung von Jooo.de hab ich folgendes gefunden: (benötigt Prototype Framework, nur getestet im FF!)
javascript Code:
  1. XML = {
  2.     createTemplate: function(elem){
  3.         return new XML.Template(elem);
  4.     },
  5.     hasCDATA: function(elem){
  6.         return elem.firstChild.nodeType == Node.CDATA;
  7.     },
  8.     getCDATA: function(elem){
  9.         if(this.hasCDATA(elem))
  10.             return elem.firstChild.nodeValue;
  11.         else
  12.             throw new Exception("element doesn´t contain #CDATA content");
  13.     }
  14. }
  15. XML.Template = Class.create();
  16. XML.Template.prototype = {
  17.     initialize: function(elem){
  18.         this.elem = elem;
  19.         this.html = XML.hasCDATA(elem) ? XML.getCDATA(elem) : Element.getInnerHTML(elem);
  20.         if(this.elem.hasAttribute("xmlns")){
  21.             this.xmlns = this.elem.getAttribute("xmlns");
  22.         }else{
  23.             this.xmlns = "http://www.w3.org/1999/xhtml";
  24.         }
  25.         this.vars = new Array();
  26.     },
  27.     assign: function(key, value){
  28.         if(value == undefined && key.each && typeof key.each == "function"){
  29.             key.each(function(item){
  30.                 value = item.value;
  31.                 key = item.key;
  32.                 this._assign(key, value);
  33.             }.bind(this));
  34.         }else
  35.             this._assign(key, value);
  36.     },
  37.     _assign: function(key, value){
  38.         //alert("assign: "+key+"=>"+value);
  39.         this.vars&#91;key&#93; = value;
  40.     },
  41.     toHTML: function(o){
  42.         this.parse(o);
  43.         return this.html;
  44.     },
  45.     hasKey: function(key){
  46.         return this.vars&#91;key&#93; != undefined;
  47.     },
  48.     getKey: function(key){
  49.         //alert("value: "+key+"=>"+this.vars[key]);
  50.         return this.vars&#91;key&#93; || null;
  51.     },
  52.     parse: function(o){
  53.         //alert(Object.dump(this.vars));
  54.         if(typeof o == "object")
  55.             this.assign("this", o);
  56.         var templateVar = /\$\{(&#91;A-z_&#93;&#91;A-z0-9_\-&#93;+)(\.&#91;A-z_&#93;&#91;A-z0-9_\-&#93;+)*\}/;
  57.         var hits;
  58.         while(hits = templateVar.exec(this.html)){
  59.             var key = hits&#91;1&#93;;
  60.             if(! this.hasKey(key)){
  61.                 this.html = eval('this.html.replaceAll(/\\$\\{' + key + '(\\.[A-z_][A-z0-9_\\-]+)*\\}/, "' + hits&#91;0&#93;.substring(1) + '");');
  62.                 continue;
  63.             }
  64.             path = hits.slice(2);
  65.             path = path.collect(function(s){
  66.                 if(s == undefined) throw $continue;
  67.                 return s.substring(1);
  68.             })
  69.             var tplVar = key;
  70.             if(path.length > 0)
  71.                 tplVar += '\\.' + path.join("\\.");
  72.             var tplVal = this.getValue(key, path);
  73.             if(tplVal == undefined){
  74.                 tplVal = "{" + tplVar + "}";
  75.             }
  76.             var func = 'this.html.replaceAll(/\\$\\{' + tplVar + '\\}/, "' + tplVal + '");';
  77.             this.html = eval(func);
  78.         }
  79.     },
  80.     getValue: function(key, path){
  81.         function recursion(o, path){
  82.             var key = path&#91;0&#93;;
  83.             //alert(Object.dump(o, "plain", false))
  84.             if(o&#91;key&#93; == undefined){
  85.                 return undefined;
  86.             }
  87.             if(path.length == 1){
  88.                 return o&#91;key&#93;;
  89.             }
  90.             return recursion(o&#91;key&#93;, path.slice(1));
  91.         }
  92.         if(path.length == 0)
  93.             return this.getKey(key);
  94.         return recursion(this.getKey(key), path);
  95.     }
  96. }
Dieses Script ist Teil einer Widget-Engine und baut aus Templates in einer XML-Datei, die ein Widget beschreibt, den HTML-Code zur Darstellung.
Der Template-Code einer solchen XML-Datei sieht dann ungefähr so aus:
xml Code:
  1. <div class="Widget NewsReader section">
  2.     <h4>${title}</h4>
  3.     ${date}
  4.     <ol>
  5.         <li class="empty"></li>
  6.     </ol>
  7. </div>
Der Template-Code muss nicht umbedingt als eigene XML-Datei vorliegen, sondern kann mit ein bischen Umbauen auch direkt im verwendenden Script stehen. Eine Trennung ist aber imo noch eher nach dem MVC prinzip. Aber das hängt auch von der jeweiligen Anwendung ab.
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.03.2007, 17:10 Nach oben    #5
Erfahrener Benutzer
 
Benutzerbild von Bleistift
 
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 298
Standard

Das sieht super aus! Danke! Ich werde mir das mal heute Abend genauer ansehen.
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination.
Bleistift ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.03.2007, 18:18 Nach oben    #6
Erfahrener Benutzer
 
Benutzerbild von Bleistift
 
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 298
Standard

Eine Frage hab ich noch: Wie lese ich denn die XML-Datei ein? Ein kleiner Use Case wäre ganz nützlich
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination.
Bleistift ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 21.03.2007, 18:57 Nach oben    #7
Johannes Müller
 
Benutzerbild von $traight-$hoota
 
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 521
Standard

Auch einfach per XMLHttpRequest. Das response hat ja die Eigenschaft responseXML, die den komplett geparsten DOM-Tree der XML-Datei enthält.
Du kannst in eine Datei auch mehrere Templates packen und die dann im javascript separieren.
beispiel:
xml Code:
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <t:templates xmlns="http://www.w3.org/1999/xhtml" t:xmlns="http://dev.straight-shoota.de/jooo/xml/template">
  3.     <t:template name="userMessage" >
  4.         <div class="UserMessage">
  5.             <h4>${title}</h4>
  6.             <p>${content}</p>
  7.         </div>
  8.     </t:template>
  9.     <t:template name="listItem">
  10.         <li><a href="${item.href}" title="${item.title}">${item.label}</a></li>
  11.     </t:template>
  12. </t:template>
__________________
Weißt Bescheid - Scheiß wie weit
$traight-$hoota ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.03.2007, 23:11 Nach oben    #8
Christian Schuhmann
 
Benutzerbild von bobby
 
Registriert seit: 09.03.2007
Ort: Nürnberg
Beiträge: 58
Standard

Also bisher hat mir die Templateklasse von Prototype gute Dienste erwiesen http://prototypejs.org/api/template. Aber die Lösung von $traight-$hoota ist eindeutig professioneller.

bobby.
bobby ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 22.03.2007, 23:21 Nach oben    #9
Erfahrener Benutzer
 
Benutzerbild von Bleistift
 
Registriert seit: 31.12.2006
Ort: Zürich
Beiträge: 298
Standard

Da nutzt man monatelang Prototype und kennt immer noch nie alle Funktionen
__________________
. <-- This is Punkt. Copy Punkt into your signature to help him on his way to world domination.
Bleistift ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
indireckte Frage zu Template system kampfgnom PHP-Programmierung 4 04.06.2007 04:12
Problem mit template system kampfgnom PHP-Programmierung 2 21.04.2007 17:37
eigenes Template System mit Sprachunterstützung jjelliss PHP-Programmierung 61 15.09.2006 10:00
Kleines Prob mit phpBB Template System Garnele PEAR, PECL und Frameworks 6 22.10.2005 00:31


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:24 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44