Jump to content
php.lv forumi
  • 0

Vienkārš javascript template dzinējs


codez

Question

Radās vajadzība pēc ērta, ātrdarbīga, bet tai pašā laikā vienkārša javascript template dzinēja, kas nodrošinātu ajaxgai aplikācijai ērtu json formā saņemtu datu transformāciju markup-ā.

Pētot izskatīju visus esošos populārākos dzinējus un paraugus un, aizņemoties no viena ideju, uztaisīju template dzinēju kā jQuery pluginu.

Ideja pavisam vienkārša - funkcijai par parametru tiek padots templeita strings un datu objekts. funkcija izveido funkciju, kura sastāv no templeita stringa, kurā nejavascriptiskā daļa ir iewrapota push funkcijā, tādā veidā ģenerējot masīvu, no kura beigās tiek sajoinots strings.

 

Pats plugins:

(function($){
 $.tpl = function(str, data){
   var fn = new Function("obj",
     "var ___p___=[],print=function(){___p___.push.apply(___p___,arguments);}; with(obj){___p___.push('" +
     str
       .replace(/[\r\t\n]/g, " ")
       .split("<?").join("\t")
       .replace(/((^|\?>)[^\t]*)'/g, "$1\r")
       .replace(/\t=(.*?)\?>/g, "',$1,'")
       .split("\t").join("');")
       .split("?>").join("___p___.push('")
       .split("\r").join("\\'")
     + "');}return ___p___.join('');");
   return data ? fn(data) : fn;
 };
})(jQuery);

 

Lietošana:

templeitā js kodu atdalām ar <? kods(); ?>

js mainīgā vērtības izvade <?=variable_name?>

pluginā ir definēta arī print funkcija, tāpēc var izmantot arī šādi <? print(variable); ?>

 

Piemēri:

var s=$.tpl('<div><?=name?></div>',{name:'John'}); //<div>John</div>

//piemērs ar js ciklu templeitā tabulas ģenerēšanai:
var s=$.tpl('\
<table>\
<?for(var i in d){?>\
 <tr>\
   <td><?=d[i].name?></td>\
   <td><?=d[i].age?></td>\
 </tr>\
<?}?>\
</table>\
',
 {d:[
   {name:'John',age:24},
   {name:'Bill',age:27},
   {name:'James',age:31}
 ]}
);
//<table>  <tr>    <td>John</td>    <td>24</td>  </tr>  <tr>    <td>Bill</td>    <td>27</td>  </tr>  <tr>    <td>James</td>    <td>31</td>  </tr></table>

 

 

Templeitā ir pieejami arī globālie mainīgie, bet nav pieejami funkcijas, kurā izsauc $.tpl, lokālie mainīgie.

Ja funkcijai nenodod 2. parametru ar datiem, tad funkcija atgriež uzģenerēto funkciju, kuru var izsaukt, lai aizpildītu templeitu ar datiem.

var fn=$.tpl('<div><?=name?></div>');
var s=fn({name:'John'}); //<div>John</div>
console.info(fn);
//function anonymous(obj) {
//var ___p___=[],print=function(){___p___.push.apply(___p___,arguments);}; with(obj){___p___.push('<div>',name,'</div>');}return ___p___.join('');
//}

Tas var būt noderīgi, ja teiksim vajag bieži vienu templeitu aizpildīt ar jauniem datiem, tad sākumā vienreiz izveidojam fn funkciju un tad atkārtoti izsauc tikai fn funkciju, nevis katru reizi to veido.

Edited by codez
Link to comment
Share on other sites

5 answers to this question

Recommended Posts

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...