Archives mensuelles: Février 2015

Astuce de dépannage pour Directives angulaires (Ou, Apprendre à aimer des traits d'Union partout à nouveau)

J'ai quelques applications que $http.get faire() appels et je voulais être en mesure d'afficher un message d'erreur bien formaté avec erreur laid détails cachés, mais accessible.  Essentiellement, ce:

image

Et puis si l'utilisateur clique sur l'erreur, ils voient plus d'informations:

image

Trucs simples.  Étant donné que l'erreur potentielle même exacte peut apparaître dans l'écran d'administration ainsi que l'écran de l'utilisateur final, Il prévoyait clairement une directive custom angulaire.  JE  trouvé ceci meilleure série des articles (http://weblogs.asp.net/dwahlin/creating-custom-angularjs-directives-part-i-the-fundamentals) par le grand Dan Wahlin.  Suite à ses conseils, Très vite, j'ai créé un <Bonjour tout le monde> la directive et a déménagé sur mon racloir d'affichage erreur plus complexe. Je suis tombé sur un peu de mal avec cette directive plus complexe.  Heureusement, quelque sorte par hasard, J'avais dit WebStorm (l'éditeur que j'utilise ces jours-ci) que le fichier JS est un fichier angulaire et il m'a aidé à comprendre la question.  C'est le code pour la directive elle-même:

Angular.module(« CDLApp »).directive(« generalCdlErrorHandler », fonction() {

retour {
restreindre: « E »,
remplacer: True,

champ d'application: {
retrieveLastConfigurationError: "&"
},

modèle:
'<div class = "message d'alerte alerte-danger" rôle = "message d'alerte" ng-init = "doShowExpandedErrorDetails = true" ng-show = "retrieveLastConfigurationError()">' +
"Il y avait une erreur d'e/s ou autre erreur. Cela se produit généralement parce que le fichier de données de configuration ne pourrait pas être " +
' trouvé ou le fichier de configuration contient des informations inexactes (comme faisant référence à une bibliothèque de documents ' +
"qui n'existe pas).' +
' <br />' +
' <div ng-show = « doShowExpandedErrorDetails »>' +
' <a href = "#" ng-click = "doShowExpandedErrorDetails = ! doShowExpandedErrorDetails">' +
« Cliquez ici pour masquer les détails ». +
' </un>: ' +
' <br />' +
' <pre>{{retrieveLastConfigurationError() | JSON}}</pre>' +
' <br />' +
' </Div>' +
' <div ng-show = "!doShowExpandedErrorDetails">' +
' <a href = "#" ng-click = "doShowExpandedErrorDetails = ! doShowExpandedErrorDetails">' +
« Cliquez ici pour agrandir les détails de l'erreur. » +
' </un>' +
' </Div>' +
'</Div>'
};
});

Essentiellement, Je crée un nouvel élément appelé un « generalCdlErrorHandler ».  Il a besoin d'accéder à une fonction nommée retrieveLastConfigurationError et qui est géré par l'objet de portée.  J'ai probablement aurais pu juste utiliser le champ d'application du parent, mais cela se sent paresseux.  Si quelqu'un pense que j'aurais dû faire, J'aimerais en entendre parler dans les commentaires.

C'était tout beau, mais je n'obtenais pas n'importe quoi.  Pas sautés vers le haut dans la console d'erreurs (au moins une fois, j'ai corrigé toutes les erreurs de sx, que j'ai créé le long du chemin).  Je n'ai simplement pas n'importe quelle sortie de la directive.  Je suis allé et ajouté du texte statique avant la directive ng-show et je * fait * qui se. Cela me fait penser que, peut-être, la directive n'était pas autorisée implicitement créer nouveau vars comme « doShowExpandedErrorDetails » ou ont un « ng-init » là-dedans. 

Je suis retourné dans le HTML pour voir que si j'avais un type et cette fois WebStorm m'a aidé.  J'avais été en passant à la fonction retrieveLastConfigurationError comme ça:

<général-cdl-gestionnaire d'erreurs retrieveLastConfigurationError="CDLController.retrieveLastConfigurationError()">
</général-cdl-gestionnaire d'erreurs>

Mais il faut vraiment que ce soit:

<général-cdl-gestionnaire d'erreurs récupérer-dernier-configuration-erreur = "CDLController.retrieveLastConfigurationError()">
</général-cdl-gestionnaire d'erreurs>

WebStorm a été assez intelligent pour savoir qu'elle devait être un trait d'Union.  S'il n'avait pas fourni ce soupçon, Je serait probablement être encore dépannage cela Sourire.  Amusants fois!

L'astuce est la suivante: non seulement le nom de l'élément de directive est trait d'Union, sont donc des attributs que vous lui ajoutez.  Une fois que j'ai ajouté les traits d'Union, Tout fonctionnait très bien.  Tutoriel de Dan est arrivé d'utiliser des noms courts unique, donc je n'ai pas la connexion.

Espérons que cela aide quelqu'un.

</fin>

undefinedS'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin

IE9 Ne l'aime vraiment quand vous prenez un raccourci avec votre <travée> Balises

Je suis tombé dans une mauvaise habitude d'utiliser Chrome tout le temps.  C'est « mauvais » parce que les trucs que je développe vraiment doit s'exécuter sur beaucoup d'autres navigateurs web, y compris, Malheureusement IE8.  Mon portable de travail a IE9 standard pour une raison quelconque) et je faisais juste un rapide check pour voir ce que les choses se sont comme et... il n'était pas jolie.  Par exemple:

image

C'est * censé * ressembler à ceci:

image

 

Non seulement il était éteint, mais mes événements click n'ont pas été tiré.  (Plupart d'entre eux, de toute façon).

Visuellement, Il semblait que les choses ont commencé à aller hors des rails près le lien « Configuration avancée ».  J'ai creusé dans la partie du code HTML et trouvé que j'avais cette ligne:

<span class = « glyphicon glyphicon nouvelle-guichet » />

Cela semble comme syntaxe admissible ("Version de chrome 40.02214.94 m"est très bien avec lui). Je suis allé et il a changé de toute façon, comme le montre:

<span class = « glyphicon glyphicon nouvelle-guichet »></travée>

Qui le fixe.

Une telle petite chose minuscule causé un tel gâchis énorme d'un écran.  Amusants fois.

Cela est arrivé à une solution rapide, mais c'est aussi le genre de chose qui obtient juste votre colonne vertébrale hors de l'alignement quand vous le voyez.  Il y a plus 500 lignes de code HTML dans cette fonction peu admin et vous ne veulent pas se retrouver à creuser parmi les mauvaises herbes, jamais Sourire.

</fin>

undefinedS'abonner à mon blog.

Me suivre sur Twitter à http://www.twitter.com/pagalvin