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

HTTP 406 Erreur lors de l'utilisation $http.get angulaire contre les Points de terminaison pour le repos SharePoint

Mise à jour: Marc AD ndersson a souligné ce grand morceau de l'info: http://blogs.Office.com/2014/08/13/JSON-Light-support-Rest-SharePoint-API-Released/. Qui explique beaucoup de choses :).

C'est peut-être le pire titre d'un billet de blog jamais! Anyhoo.

Généralement, je fais toutes mes prototypage sur une instance d'Office 365. J'ai mon instance personnelle afin que je ne dois pas être inquiet qui touchent tout le monde. Soit dit en passant – Rappelez-vous lorsque nous appelons menées autour des machines virtuelles sur nos ordinateurs portables avec MOSS – SQL Server, IIS, décidant de Hyper-V vs. VMWare? Anyhoo...

J'avais mis au point une application à l'aide de moment angulaire dans cet environnement qui fait, entre autres choses, ce:

$http.Get(serverUrl)
.succès(fonction(données, statut, en-têtes, config) {

var getLinksResponse = données;

getLinksResponse.value.forEach(fonction(theResult) {

// et ainsi de suite et donc de mousse

Cela fonctionnait très bien dans deux environnements SharePoint en ligne. Cependant, Quand mon collègue il porté vers une instance de Cloudshare, il devenait un HTTP 406 erreur (qui était la première fois jamais, je suis celui-là, donc... yay, Je pense). Nous avons fait quelques recherches et a remarqué que l'en-tête « Accepter » était éteint. SharePoint en ligne était parfaitement heureux avec:

Accepter: application/json

Mais l'instance de cloudshare (qui est SP sur prem, hébergé sur un serveur virtuel) voulait le classique « odata = verbose "ajouté dans ainsi:

Accepter: application/json;OData = verbose

Pour résoudre ce, Nous avons ajouté l'en-tête comme tel:

var config = {en-têtes: {
« Accepter »: « application/json;OData = verbose'
}
};

$http.Get(serverUrl,config)
.succès(fonction(données, statut, en-têtes, config) {

var getLinksResponse = données;

getLinksResponse.value.forEach(fonction(theResult) {

// et ainsi de suite et donc de mousse

Qui s'est débarrassé de la 406, mais il a aussi changé le format de la réponse. C'était plus... bavard. (haha!) Plusieurs modifications ont été nécessaires et voici le résultat final:

var config = {en-têtes: {
« Accepter »: « application/json;OData = verbose'
}
};

$http.Get(serverUrl,config)
.succès(fonction(données, statut, en-têtes, config) {

var getLinksResponse = données;

getLinksResponse.d.Results.forEach(fonction(theResult) {

// et ainsi de suite et donc de mousse

C'est seulement transformée en un 30 problème minute pour nous, donc nous avons eu de la chance. J'espère que quelqu'un le trouve utile.

</fin>

Mode d'emploi: Activer plusieurs anguleux SharePoint WebPart sur la même Page

Ce blog postes décrit comment vous pouvez avoir plusieurs composants WebPart SharePoint de base de Angular.js (référencés via un composant WebPart éditeur de contenu) sur la même page. J'appelle un composant WebPart éditeur de contenu (CEWP) qui référence JavaScript construit en utilisant le framework Angular.js « Partie Web angulaire ».

Processus de démarrage du moment angulaire est super facile et à peu près tous les exemples que vous trouverez sur les internets va quelque chose comme ça:

<html ng-app = « myApp »>

<bla /><bla /><bla />

</html>

Cela tombe en panne, Cependant, Si vous souhaitez activer multiples CEWP représentant plusieurs composants WebPart angulaire sur la même page. Angulaire sera automatiquement l'amorcer contre la première directive de ng-app découvertes – au moins depuis la version angulaire 1.3.6. La solution est assez simple : manuellement amorcer votre code à la place. Ce qui précède maintenant remplace par quelque chose comme ça:

<corps>
<d
id IV =”bootstrapHere” ng-contrôleur =”myController comme theController”>
<bla /><bla /><bla />
</Div>
</corps>

<script src =”//Ajax.googleapis.com/ajax/libs/angularjs/1.3.6/Angular.js”></script>

<script>
Angular.bootstrap(Angular.Element(document.getElementById(“bootstrapHere”)),[« myApp »]);
</script>

Essentiellement, au lieu de ng-app sur l'élément pour faire votre amorçage, vous gifler un ID sur cet élément. Puis, utiliser des données d'amorçage() méthode sur angulaire lui-même pour contrôler l'amorçage du processus en cours d'exécution. J'ai testé avec trois WebPart angulaires différentes sur la même page et ça marche un charme.

</fin>

undefinedS'abonner à mon blog.

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

La Commission de véhicule automobile du New Jersey prend une autre victime

Si, mon fils est un peu en retard, obtenir son permis de conduire.  Hier, en milieu de matinée, HE camions jusqu'à Oakland NJ pour l'obtenir.  Il y arrive, remplissages sur ses documents est délivré un permis non estampillé et apprend qu'il doit maintenant aller en un autre Emplacement de MVC de passer le test de son oeil.  Parce que, apparemment, testeurs d'oeil hautement qualifiés ne vivent pas juste n'importe où, NJ MVC doit donc aller où le talent est.  Ou, C'est peut-être parce qu'ils suivent une philosophie de l'hamiltonien de consolidation?  Autant que Hamilton a estimé fabrication et financier consolidation étaient essentielles pour la future force économique de la République, peut-être NJ MVC se sent qu'ils doivent consolider eye test de talent pour la future force de NJ MVC?  C'est peut-être partie d'un plan d'ineffable?  Hélas, J'ai seulement des questions sur ce sujet et pas de réponses. 

Conseils d'Oakland suivant, femme et son fils troquent leur chemin vers le bas pour Lodi, NJ avec le permis non estampillé à Lodi.  Lodi peut avoir le pire parking de n'importe quel endroit de NJ MVC.  Et, étant donné qu'ils hébergent également quelques-unes des rares encore très convoité eye test machines et œil tests professionnels, ils attirent les suppliants de tout poil, nuances, l'éducation et des badauds.  Mon fils travaille son chemin dans le labyrinthe des lignes et des indications fournies par les professionnels de NJ MVC « never-look-them-in-the-eye » et enfin arriver à l'oeil, test de ligne.  Maintenant, ils apprennent que la personne d'Oakland a fait une erreur sur le permis non estampillé.  Il a mal saisis le numéro de sécurité sociale, mettre un un "8" au lieu de "2" dans l'un des chiffres.  La personne de NJ DMV savait cela, parce que quand elle a tiré vers le haut de ce mal SS# dans l'ordinateur, Il n'a pas montré le nom de mon fils.  Femme et son fils de dire, "oh, C'est le mauvais numéro, Il faut un '2' il au lieu de « 8. » »  Ce que beaucoup, peut-être chaque personne juste esprit pourrait s'attendre à ce stade est que la personne NJ MVC simplement corriger le nombre qu'ils vient d'entrer dans l'ordinateur.  Ha! Fool!  Aucun, au lieu de cela, lui a demandé de fourni sa carte de sécurité sociale.  Nous allons une digression et considère que, afin d'obtenir le permis non estampillé en premier lieu, il avait déjà fourni un passeport nous ainsi qu'un New Jersey certificat de naissance et de la lettre écrite pour lui à son domicile.   Sa mère est avec lui, partage son nom, son adresse, sa hauteur (mais malheureusement, pas à son goût dans les films de science-fiction) ... vous le nom, mon fils est bel et véritablement identifiés comme vie longtemps résidente de ces États américains et en effet, New Jersey elle-même de toute mesure que vous pouvez imaginer.  Si la personne NJ MVC aurait simplement fixé l'erreur qui fait de la personne de Oakland, l'ordinateur serait ont tiré vers le haut les informations de mon fils et qui aurait été la fin de l'histoire.  Mais encore une fois, Fool!  Ils ne peuvent pas le faire. Au lieu de cela, le MVC NJ insistent maintenant sur une carte de sécurité sociale. 

Si, femme et son fils aller maison pour l'obtenir et retour.  Et en fin de compte, Il obtient son permis.

Voilà trois différents voyages à NJ MVC en une seule journée.  Pour obtenir son permis.  Il a fallu presque 6 heures de bout en bout.  Il s'agit d'introduction de mon fils à la conduite dans le Garden State.

NJ MVC est manifestement cassé. 

</fin>

Angulaire échoue d'amorçage dans IE9

J'ai été jouer avec Angular.js pour la dernière longue tout en et pour la vie de moi, Je ne pouvais pas mes apps angulaires pour lancer dans IE9.  Ils travaillent tous très bien dans IE11 mais IE9 serait juste montrer les accolades et des morceaux similaires.

J'ai cherché et n'a pas pu trouver quelqu'un se plaindre de son problème.  Il a bien fonctionné en Chrome, IE11, tout simplement pas IE9.

J'ai été jeté par le fait que la console IE me donnait des erreurs comme ça:

SEC7111: Sécurité HTTPS est compromise par la res://ieframe.dll/forbidframing.htm

Cette erreur a eu moi en pensant il y avait quelques problème téléchargement huisserie ou autres bibliothèques dont j'avais besoin.  Il s'avère que, ce n'était pas la question.

Par farfouillé les internets, Enfin, j'ai découvert que le membre de phrase que je devais chercher était « bootstrap » et qu'il semblait que l'amorçage ne parvenait pas.  En fin de compte, mon problème était que j'avais décoré mon <html> ayant un attribut ng-app, comme dans:

<html ng-app = « MatrixApp »>

Puits, qui n'a pas fonctionné pour IE9.  Au lieu de cela, J'ai enveloppé tout le reste du code HTML dans le <corps> à l'intérieur d'une balise div et références MatrixApp comme ça.

Problème résolu.

J'espère que ce quelqu'un enregistre quelque chagrin.

</fin>

Création de formulaires SharePoint personnalisé sans une Page maître

Mon collègue, Lauren Jones, rédigé une belle étape par étape sur comment créer un formulaire de saisie de données personnalisées à l'aide de SharePoint Designer.  C'est pas exactement « nouveau sous le soleil", mais il ya un peu de torsion.  Dans ses mots:

Créer des formulaires personnalisés est simple à faire, dans SharePoint Designer, Accédez à votre liste et sur le ruban, sélectionnez menu « formulaire de liste’ et créez votre modèle de formulaire.

Cela fonctionne bien si vous souhaitez que votre formulaire à joindre à votre page maître, mais que se passe-t-il si vous avez le cas d'utilisation de la création d'un formulaire qui est dans une fenêtre contextuelle ou autonome sans le chrome de SharePoint. J'ai eu exactement ce cas d'utilisation, J'ai voulu personnalisé style une forme alors utiliser ce formulaire dans un popup div inline dans une page.

Ne désespérez pas, Il y a une façon de faire qui n'est pas autrement intuitive mais assez facile à réaliser.

Vous pouvez lire tous les détails ici: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=55&rtitle=customforms&rsrouce=pgblog et vous pouvez le voir en action en cliquant sur le lien « nous contacter pour plus d'informations » sur n'importe lequel des services sur la page de notre site de Big Apple SharePoint (http://www.bigapplesharepoint.com/services).

Lauren a écrit beaucoup de bonnes choses sur UX et image de marque.  Vous pouvez voir plus de l'écriture ici, ici: http://www.bigapplesharepoint.com/team?showExpertName=Lauren%20Jones.

</fin>

Conception distrayante et ivre de la fonctionnalité Coolaid

Mon collègue, Lauren Jones (https://twitter.com/laurenjones02) a écrit un court article parlant de comment trop complexes déploiements de SP sont très dures sur des utilisateurs finaux.  Il est peu évident, d'une manière, mais il est facile pour moi de dire que, après que j'ai orchestré un grand nombre de déploiements complexes des choses aux utilisateurs non préparés au cours des années.

Voici la clé ' graph:

Il y a cinq ans, Quand j'ai roulé sur SharePoint à un organisme pour la première fois avec un objectif de devenir la plateforme de collaboration et remplacent les disques de partage, Nous avons également introduit social et grâce au flux RSS flux RSS, Mes Sites et les profils des conseils scolaires, et le marquage de la folksonomie. Inutile de dire que, C'était beaucoup pour les utilisateurs finaux d'adopter un seul coup. Alors qu'il y avait des succès avec l'adoption autour de gestion des documents et des profils, RSS et marquage eut moins de succès, et ce n'était vraiment en raison du changement gestion communication et formation. Nous ne pouvions y parvenir tout à la fois. Prenant le moins est plus approche et libérant des fonctionnalités en phases est plus facile pour les utilisateurs finaux à accepter et à adopter pour.

Cet article rappelle un autre peu par que j'ai lu Kris Gale associés à l'ensemble des fonctionnalités de Yammer, “Celle des coûts ingénieurs et chefs de produits ne considèrent pas.”

Si vous avez une histoire d'horreur ou de la réussite à partager, J'espère que vous allez que faire dans les commentaires le site de Big Apple.

</fin>

Weekly Roundup – Juillet 13, 2014

J'ai pour à xpost cette Voici le week-end dernier. 

Voici le 3RD article d'une série où je vous écris sur les blogs et articles en ligne qui ont été particulièrement intéressants pour moi dans la dernière semaine ou deux.  Entrée cette semaine dans la série met en lumière deux projets CodePlex pour un éventuel remplacement d'InfoPath et de la gestion des autorisations avec SharePoint, nouvelles sur les satellites, encore un autre framework JavaScript et un clin de œil à Ada Babbage et son rôle dans l'histoire de l'informatique.

Vous pouvez le lire ici: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=93&rsource=pgblog&rtitle=roundup

</fin>

Requêtes CAML vue en temps réel avec la visionneuse ULS

Mon collègue, Gwendal Patel, a écrit jusqu'à une belle revue de projet décrivant la façon de voir le CAML derrière divers SP interroge qui se produisent dans le cadre de l'entreprise en temps réel à l'aide de la visionneuse de l'ULS.

Voici l'intro:

Jamais vous voulez savoir quelles requêtes CAML sont exécutées par SharePoint Server?

Puits, pour le dépannage et l'objectif d'apprentissage, Il n'est pas une mauvaise idée. Après tout, Générateur de profils SQL a aidé nous résoudre beaucoup de problèmes.

Il peut y avoir des produits sur le marché, mais j'ai trouvé un moyen de le faire sans dépenser plus d'argent! Et c'est ici...

Vous pouvez lire tout cela ici: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=68&rsource=pgblog&rtitle=caml.

</fin>