web-dev-qa-db-fra.com

vérification de la variable non définie dans le modèle de soulignement

Je montre une vue modale des objets libraryPrep dans mon modèle comme ceci:

if (_.isUndefined(this.libraryPreps)) {
                this.$el.html(this.template({  }));
            } else {
                this.$el.html(this.template({ libraryPreps: this.libraryPreps.toJSON() }));
            }

L'instruction else fonctionne lorsque j'ai un objet libraryPreps. Dans mon modèle, je l'utilise comme ceci:

<select id="libraryPreps" >
                    <%  if (!_.isUndefined(libraryPreps)) { %>
                    <% _.each(libraryPreps, function (libraryPrep) { %>
                    <option value="<%=libraryPrep.id%>"><%= libraryPrep.name %></option>
                    <% }); %>
                    <% } %>
                </select>

Lorsque je n'ai pas d'objet libraryPreps, mon modèle n'est pas rendu et une erreur sur la console s'affiche, indiquant que libraryPreps n'est pas défini. Est-ce que je recherche incorrectement undefined dans mon modèle? J'ai l'impression de le vérifier de la même manière dans ma vue modale dorsale, mais pour une raison quelconque, dans mon modèle actuel, cela ne semble pas fonctionner. La notation de mon modèle est-elle correcte? Merci.

16
Crystal

Si vous transmettez la variable à une fonction, celle-ci est en cours d'évaluation et émettra une erreur car il n'y a pas de telle variable. En revanche, dans votre vue dorsale, vous accédez à une propriété property d’un objet qui fonctionnera toujours (et renverrez la valeur undefined si aucune propriété portant ce nom n’existe).

Au lieu de cela, vous devrez utiliser l'opérateur typeof, qui fonctionnera même pour les variables non déclarées (consultez variable === undefined vs typeof variable === "undefined" et JavaScript check if la variable existe (est définie/initialisée) ):

<select id="libraryPreps"><%
    if (typeof libraryPreps !== "undefined") {
        _.each(libraryPreps, function (libraryPrep) { %>
            <option value="<%=libraryPrep.id%>"><%= libraryPrep.name %></option><%
        });
    }
%></select>

Pour utiliser _.isUndefined dans votre modèle, vous devez rendre la valeur explicitement disponible dans le modèle. De les docs :

Par défaut, template place les valeurs de vos données dans l'étendue locale via l'instruction with. Toutefois, vous pouvez spécifier un seul nom de variable avec le paramètre variable. Cela peut considérablement améliorer la vitesse de rendu d'un modèle.

_.template("Using 'with': <%= data.answer %>", {answer: 'no'}, {variable: 'data'});
=> "Using 'with': no"

Donc, avec ça, vous pouvez écrire des modèles comme ceci:

 <% if (!_.isUndefined(data.libraryPreps)) { %> …
 <% if ("libraryPreps" in data) { %> …
29
Bergi

Je sais que cela implique un vieux fil. Mais cette question reste toujours d'actualité.

J'ai créé une solution pour ma propre pile. Cela pourrait être utile pour les autres programmeurs.

Ce code vérifie si les variables sont indéfinies ou nulles. Si les variables ne sont pas définies ou sont nuls, le nom de la variable est renvoyé. (Avec la syntaxe du modèle).

Cette modification est testée pour underscorejs v1.6.0. Avec des modifications mineures, cela fonctionnera jusqu’à 1.9.1. Plus loin à Lodash. Cela fonctionnera avec des ajustements mineurs!

Dans la version de développement de soulignement sur:

règle v1.6.0: 1239

Règle des nouvelles versions: 1575

Ancien code:

if (escape) {
  source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
  source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
  source += "';\n" + evaluate + "\n__p+='";
}

Nouveau code:

if (escape) {
    source += "'+\n((typeof " + escape + " === \"undefined\" || " + escape + " === null) ? \"<%-" + (escape.toString()) + "%>\": _.escape(" + escape + "))+\n'";
}
if (interpolate) {
    source += "'+\n((typeof " + interpolate + " === \"undefined\" || " + interpolate + " === null) ? \"<%=" + (interpolate.toString()) +"%>\":" + interpolate + ")+\n'";
}
if (evaluate) {
    source += "';\n" + evaluate + "\n__p+='";
}
0
Ivo

J'ai eu un problème similaire, j'ai trouvé la solution suivante:

Au lieu de: if (typeof libraryPreps !== "undefined") {

Utilisez: if (!_.isUndefined(obj.libraryPreps)) {

0
nickel715