Archives Catégorie: JavaScript

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>

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>

Prise de conscience / Adoption des Frameworks JavaScript

Mon collègue, Javed Ansari (http://www.bigapplesharepoint.com/team?showExpertName=Javed%20Ansari&rsource=pgblog), a écrit un billet de blog résumé court sur les cadres qu'il aime ou a au moins utilisé avec SharePoint: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=53&rsource=PGBlog).

jQuery semble avoir été le vainqueur sur le terrain, pour ainsi dire, depuis des années, mais les autres sont plus nouvelles et alambics en quelque sorte luttant contre elle, comme le moment angulaire. (SPServices, Bien sûr, est un épargnant de vie depuis années et continuera d'être donc je pense que).

Ce que les gens utilisent? Ils sont concentrent davantage sur un outillage de Microsoft (CSOM / JSOM) ou se déplaçant vers le moment cinétique, Knockout, Ember, etc.?

J'ai un penchant croissant pour ces cadres non Microsoft. Je pense que les trucs MSFT sont plus difficile et plus difficiles à travailler avec, exiger presque comme une grande partie de la courbe d'apprentissage comme ancienne côté serveur dev.

Poster un commentaire ici ou plus à Grosse pomme SharePoint Si vous voulez discuter (Big Apple aura plus de chances d'une bonne discussion).

</fin>

Surmonter un problème ennuyeux avec des URL relatives dans le lancement rapide de SharePoint

Je voulais ajouter un lien vers la navigation lancement rapide l'autre jour et m'a SharePoint:

image

Version texte pur qui est:

Assurez-vous que l'URL est valide et commence par soit un caractère valide (un signe dièse (#) ou oblique (/)) ou un protocole de prise en charge valable (par exemple, « http://’, « https://’, ' fichier://’, « ftp://’, « mailto:’, « nouvelles:’).

"Blech et pox!"J'ai dit.

Une solution de contournement consiste à utiliser JavaScript pour trouver un lien connu dans le lancement rapide et substituer son comportement.

Pour tester cette, Ajouter un nouveau lien à votre site de test thusly:

image

J'ai utilisé jQuery. Pour le résoudre, obtenir quelques JavaScript et jQuery sur la page à l'aide de votre technique préférée et avec une ligne de code suivante:

 

$(document).prêt( fonction () {

    $("un:contient(« Tester le remplacement de l'URL »)").Cliquez sur(fonction () { alerte("Cliquez sur changement de comportement!"); retour faux;});

});

Et ton oncle Bob.

Le sélecteur jQuery conclut chaque <un> balise qui a « Test URL de remplacement » dans son nom. Vous pouvez trouver-tune qui selon votre lien et autres.

Le .Cliquez(fonction() remplace tout ce qui l'aurait fait SharePoint lorsque l'utilisateur a cliqué. Assurez-vous que vous « retournez false » ou bien il va faire vos trucs et puis essayez de la chose href trop, qui n'est certainement pas votre but.

Cela a été fait et test dans un environnement en ligne de SharePoint mais doit travailler bien en 2010 et plus tôt aussi.

</fin>

undefinedS'abonner à mon blog.

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

Pauvre homme de mise en cache en JavaScript

[TL;DR version: utiliser des cookies pour stocker les résultats des appels asynchrones; restituer les résultats des dernières async appels immédiatement et puis validez-les après chargement de la page.]

J'ai travaillé sur le site intranet SharePoint pour un client qui dispose, entre autres choses, une navigation secondaire stylisée dont les options du menu sont gérées via une liste personnalisée vieux ordinaire.  L'idée est que le client obtient contrôler le menu de « leur » site sans affecter ou être affecté par le système mondial de navigation par elle.

(Il y a quelque chose d'incroyablement subversif sur l'ajout d'un CEWP qui pointe vers un fichier HTML qui charge des CSS et JS fondamentalement modifier presque tout sur le comportement d'un site... mais c'est pour un autre poste)

Le code pour cet jolie simple:

Le mal ici spot, c'est que chaque fois que quelqu'un frappe une des pages du site, navigateur web de l'utilisateur tend la main pour obtenir des éléments de la liste.  Lorsque dev est terminée et l'essai a prouvé des choses à être stable et complet, Cet appel n'est pas nécessaire plus de 99% du temps étant donné que le menu change rarement.  Il a aussi un effet bizarre de UI qui est commun dans ce nouveau monde de sites web hyper-ajaxy – rend la page et ensuite seulement le menu rend.  Il est nerveux et distrayant à mon avis.  Et de nervosité. Si, la mise en cache. 

J'ai modifié la logique thusly:

  • Recherchez un cookie dans le navigateur qui contient le menu, comme je l'ai lu dernière
    • Si trouvé, rendent immédiatement.  N'attendez pas la page pour terminer le chargement.  (Vous devez vous assurer que votre code HTML est stratégiquement placé ici, mais ce n'est pas difficile à faire).
  • Attendez que la page pour terminer le chargement et appeler un async pour charger les éléments de menu dans une liste à l'aide de repos ou lists.asmx ou autre
  • Comparer ce que j'ai contre le cookie
    • Si elle correspond, ARRÊT
    • Dans le cas contraire, à l'aide de jQuery, remplir dynamiquement un tas si <Li>les de dans un <UL>
  • Utiliser les CSS pour faire tout le formatage
  • Profit!

Certains d'entre vous vont dire, "Hé! Il n'y a aucune véritable cache passe ici puisque vous lisez le menu quand même à chaque fois.”  Et vous avez raison-je ne remets pas le serveur tout type de rupture.  Mais parce que l'appel est asynchrone et arrive après que la page initiale de la charge utile HTML rend pleinement, il « sent » plus réactif à l'utilisateur.  Le menu rend assez autant que dessine la page.  Si le menu arrive au changement, l'utilisateur est soumis à une re-dessiner de nervosité du menu, mais seulement qu'une fois.

Il existe des moyens pour accroître l'efficacité de cette mise en cache et dépanner le serveur en même temps:

  • Mettre dans une règle que le cache de « cookie » est valable pour un minimum de 24 heures ou quelques autres délais. Tant qu'il n'y a aucun cookie a expiré, Utilisez instantané menu du cookie et ne jamais frapper le serveur.

Eh bien... c'est tout ce qui viennent à l'esprit dès maintenant :). 

Si quelqu'un a des idées intelligentes ici je serais ravi de les connaître.

Et enfin, cette technique peut être utilisée pour d'autres trucs.  Page de ce client a un certain nombre de choses pilotés par les données sur les différentes pages, beaucoup d'entre eux changer relativement rarement (comme une fois par semaine ou une fois par mois).  Si vous ciblez des zones spécifiques de la fonctionnalité, vous pouvez donner une interface utilisateur plus réactive en extraient le contenu du magasin local de cookie et de rendre immédiatement.  Il se sent plus rapidement à l'utilisateur, même si vous n'enregistrez pas le serveur des cycles.  Vous peut sauver les cycles serveur en décidant sur certaines conditions et déclencheurs d'invalider ce cache de cookie local.  C'est tout situationnelle et artsy trucs et vraiment le plus amusant :). 

</fin>

undefinedS'abonner à mon blog.

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