Est-il possible d'appeler une fonction avec des arguments avec Mustache.js
{{somefunction(somevalue)}}
Merci.
Est-il possible d'appeler une fonction avec des arguments avec Mustache.js
{{somefunction(somevalue)}}
Merci.
Consultez la section sur les lambdas à https://mustache.github.io/mustache.5.html
Bloc de modèles de moustaches :
{{#someFunction}}someValue{{/someFunction}}
Bloc fonctionnel :
someFunction : function () {
return function(val, render) {
return "I passed in this value: " + render(val);
};
}
Sortie :
I passed in this value: someValue
Juste un avertissement javascript, après le bloc de fonction return, il doit y avoir un point-virgule ( ;). Le paquet SublimeLinter de Sublime Text l'a relevé.
Cela ne fonctionnerait pour moi que si je changeais la signature de la fonction en return function(val, render) {
Pour moi, cela fonctionne :
ajouter la fonction générale FUNC à json (données) :
data.FUNC = function(){
return function(val, render){
var values = JSON.parse(render(val));
return window[values.FUNCNAME].apply(this, values.FUNCARGS);
};
};
javascript régulier sur la page :
function foo(arg1, arg2){
return "Arg1 is " + arg1 + " and Arg2 is " + arg2;
};
Bloc de modèle Mustache appelant la fonction javascript habituelle avec des valeurs de balises comme arguments :
{{#FUNC}}{"FUNCNAME":"foo", "FUNCARGS":["{{page}}","{{title}}"]}{{/FUNC}}
vous pouvez également appeler une fonction définie dans le json :
{{#calljsfunction}} {{#FUNC}}{"FUNCNAME":"{{calljsfunction}}", "FUNCARGS":["{{page}}","{{title}}"]}{{/FUNC}}{{/calljsfunction}}
Si vous voulez que le contenu du script soit exécuté après l'insertion du balisage dans le domaine, vous devez utiliser une bibliothèque qui fera de même, comme jquery.
Essayez-le ici :
http://jsfiddle.net/anilkamath87/GBP8N/
Aussi si vous voulez invoquer une autre méthode dans votre fichier script. Tout ce que vous devez faire est d'appeler la fonction en fonction de la portée de cette fonction et si elle a été préchargée dans le dom.
J'espère que cela vous aidera.
P.S : notez l'échappement de la balise script dans le balisage du modèle.
Comme j'envoie les données de mon modèle à partir d'une API en JSON, l'encodage d'une fonction dans le JSON est compliqué. J'ai donc créé une fonction simple pour analyser la fonction arbitraire avec les paramètres de la réponse API afin d'appeler les fonctions JS existantes. Les commentaires ci-dessous expliquent la fonctionnalité.
Le TLDR ; l'analyse syntaxique des fonctions
$.each(funcs, function (funcName, args) {
window[funcName].apply(null, args);
});
Le contexte dans lequel il est utilisé.
données de réponse api
{
"templatesList": [
{
"load_sites": { // the template key - see load_templates()
"target": "#main", // the target css selector
"append": false, // whether to append to, or set content of css selector
"data": { // mustache template data
"sites": [
{
"siteID": "1",
"siteName": "Mr Bean House",
},
{
"siteID": "2",
"siteName": "Bob the Builder House",
}
]
},
"funcs": { // function to call after template insertion
"sites_load": [1, 2] // function sites_load(1,2);
}
}
}
]
}
fonction api reposnse parser (main.js)
$.each(apiResponse.templatesList, function (ti, templateObject) { // multiple responses in any API response
$.each(templateObject, function (templateKey, template) { // break up each into more readable chunks
render_template( template.target, templateKey, template.data, template.append, template.funcs ); // call the renderer function
});
});
fonction de rendu (main.js)
function render_template(target, templateKey, templateData, append, funcs) {
if (typeof templates_html[templateKey] !== "undefined") { // see function load_templates()
if (append) { // append template
$(target).append( Mustache.to_html( templates_html[templateKey], templateData ) );
} else { // set template as content
$(target).html( Mustache.to_html( templates_html[templateKey], templateData ) );
}
// parse functions
if(funcs){
$.each(funcs, function (funcName, args) {
window[funcName].apply(null, args);
});
}
}
}
Fonction js à appeler via la réponse API (main.js)
function sites_load(loadJobs, loadProgress){
console.log("load jobs for site", loadJobs);
console.log("load progress for site", loadProgress);
}
templates loader - charge le modèle html au chargement de la page (main.js)
// global
templates_html = {};
// load templates html file using the <script id> for the object keys
function load_templates() {
templates_html = {};
$.get("templates.html", function (templates) {
$(templates).filter("script").each(function (templateIndex, templateHTML) {
var id = $(templateHTML).attr("id"); // id from script tag
templates_html[id] = $(th).html(); // assign html content to object key
});
});
}
exemple de modèle (templates.html)
<script id="load_sites" type="text/html">
{{#sites}}
<div data-siteid="{{siteID}}">
{{siteName}}</small>
</div>
{{/sites}}
</script>
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.