Archiv der Kategorie: JavaScript

HTTP 406 Fehler bei der Verwendung von eckigen $http.get gegen SharePoint-REST-Endpunkte

Update: Marc AD Ndersson wies darauf hin, dieses großartige Stück info: http://Blogs.Office.com/2014/08/13/JSON-Light-Support-Rest-SharePoint-API-Released/. Das erklärt einiges :).

Das ist der schlechteste Titel der einen Blog-Post je! Wie auch immer.

Ich tun in der Regel alle meine Prototypen gegen eine O365-Instanz. Ich habe meine persönliche Instanz, so dass ich nicht besorgt über die Auswirkungen auf jemand anderes sein. Als Nebenwirkung – denken Sie daran, wenn wir für unsere Laptops mit Moos – durchgeführt, um virtuelle Maschinen aufrufen SQL Server, IIS, Entscheidung über Hyper-V-vs. VMWare? Wie auch immer...

Ich hatte eine app mit Angular in diesem Umfeld, das entwickelt, unter anderem, Dies:

$http.Get(serverUrl)
.Erfolg(Funktion(Daten, Status, Header, config) {

Var GetLinksResponse = Daten;

getLinksResponse.value.forEach(Funktion(i) {

// und so weiter und so Schaum

Dies war nur in zwei verschiedenen SharePoint online-Umgebungen adaequat. Jedoch, Wenn es mein Kollege auf eine Cloudshare-Instanz portiert., Er war immer ein HTTP 406 Fehler (Das war das erste Mal habe ich nie, dass man, Also... Yay, Ich vermute). Wir haben ein wenig Forschung und bemerkte, dass die "Accept"-Header Weg war. SharePoint online war vollkommen zufrieden mit:

Akzeptieren: Application/json

Aber die Cloudshare Instanz (Prem ist die SP, auf einem virtuellen Server gehostet) wollte das klassische "promoveaza = verbose" sowie in hinzugefügt:

Akzeptieren: Application/json;promoveaza = verbose

Zu reparieren, Wir haben den Header als solche:

Var-Config = {Header: {
'Akzeptieren': "Application/Json;promoveaza = verbose'
}
};

$http.Get(serverUrl,config)
.Erfolg(Funktion(Daten, Status, Header, config) {

Var GetLinksResponse = Daten;

getLinksResponse.value.forEach(Funktion(i) {

// und so weiter und so Schaum

Entledigte sich die 406, aber auch das Format der Antwort geändert. Es war mehr... ausführlich. (haha!) Weitere Änderungen sind erforderlich, und hier ist das Endergebnis:

Var-Config = {Header: {
'Akzeptieren': "Application/Json;promoveaza = verbose'
}
};

$http.Get(serverUrl,config)
.Erfolg(Funktion(Daten, Status, Header, config) {

Var GetLinksResponse = Daten;

getLinksResponse.d.results.forEach(Funktion(i) {

// und so weiter und so Schaum

Es stellte sich nur in einem 30 Minute Problem für uns, so dass wir Glück gehabt. Hoffentlich findet jemand diese nützliche.

</Ende>

Eckige nicht in IE9 Bootstrap

Ich habe mit Angular.js für die letzte lange während und für das Leben von mir gespielt, um, Meine eckig apps im IE9 starten konnte nicht abgerufen werden.  Sie alle arbeiten gut in IE11 aber IE9 würde nur zeigen, die geschweiften Klammern und ähnliche bits.

Ich suchte und fand jemand beschweren sich über sein Problem.  Es funktionierte gut in Chrom, IE11, nicht nur IE9.

Ich war durch die Tatsache geworfen, dass die IE-Konsole mir Störungen wie diese gab:

SEC7111: HTTPS-Sicherheit ist durch Res gefährdet.://ieframe.dll/forbidframing.htm

Diesen Fehler hatte mich dachte, gab es ein Problem, das Herunterladen der eckig oder anderen Bibliotheken, die ich brauchte.  Wie sich herausstellt, Dies war nicht das Problem.

Durch Stochern des internets, Ich fand schließlich heraus, dass die Phrase, die, der ich brauchte, um die Suche nach "bootstrap" war und es schien, als das bootstrapping versagt wurde.  Am Ende, Mein Problem war, dass ich verziert, hatte meine <HTML> -Tag mit dem Attribut ng-app, wie in:

<HTML ng-app = "MatrixApp">

Gut, Das ist nicht für IE9 funktioniert.  Stattdessen, Ich gewickelt den Rest des HTML-Codes in der <Körper> innerhalb eines Div und Verweise MatrixApp so.

Problem gelöst.

Ich hoffe das spart jemand einige Trauer.

</Ende>

Wachsendes Bewusstsein / Annahme des JavaScript-Frameworks

Mein Kollege, Javed Ansari (http://www.bigapplesharepoint.com/team?showExpertName=Javed%20Ansari&rsource=pgblog), schrieb eine kurze Zusammenfassung Blog-Post über Rahmenbedingungen, die er mag oder zumindest nutzt mit mit SharePoint: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=53&rsource=PGBlog).

jQuery scheint der Sieger auf dem Feld gewesen, sozusagen, seit Jahren, aber die anderen sind immer neue und Stills kämpfen sie irgendwie, wie Angular. (SPServices, Natürlich, seit Jahren ist er ein Lebensretter und wird weiterhin sein, also denke ich).

Was Menschen verwenden? Sie sind mehr auf Microsofts Werkzeuge konzentriert (CSOM / JSOM) oder mehr in Richtung Angular bewegen, Knockout, Ember, usw.?

Ich habe eine wachsende Tendenz in Richtung dieser nicht-Microsoft-frameworks. Ich finde das Zeug MSFT schwieriger und schwieriger zu arbeiten, die fast genauso viel Lernaufwand als altmodische serverseitige dev.

Schreiben Sie einen Kommentar hier oder bei Big Apple-SharePoint Wenn Sie diskutieren wollen (Big Apple haben mehr Wahrscheinlichkeit von eine gute Diskussion).

</Ende>

Überwinden Sie lästiges Problem mit relativen Urls in SharePoint Quick Launch

Ich wollte die Schnellstart-Navigation neulich einen Link hinzu und SharePoint erzählte mir:

image

Reine Textversion, die ist:

Sicherzustellen Sie, dass die URL gültig ist und mit entweder ein gültiges Zeichen beginnt (ein Nummernzeichen (#) oder Schrägstrich (/)) oder eine gültige unterstützte Protokoll (zum Beispiel, "http://’, "Https://’, ' Datei://’, "ftp://’, "Mailto:’, ' Nachrichten:’).

"Blech und pox!"Ich sagte.

Ein Workaround zu diesem soll JavaScript verwenden, um eine bekannte Verknüpfung in der Schnellstartleiste finden, und überschreiben Sie sein Verhalten.

Um dies zu testen, Wasserverbrauch Ihrer Test-Website einen neuen Link hinzufügen:

image

Ich habe jQuery. Um es zu lösen, einige JavaScript und jQuery Shape auf das Zeichenblatt verwenden Ihre bevorzugte Technik und mit einer Codezeile wie folgt:

 

$(Dokument).bereit( Funktion () {

    $("eine:enthält('Test URL Ersatz')").Klicken Sie auf(Funktion () { Warnung("geänderte Click-Verhalten!"); Rückkehr falsch;});

});

Und Bob ist dein Onkel.

Die jQuery-Auswahl findet jeder <eine> Tag, das "Test-URL Ersatz" in seinem Namen hat. Möchten Sie möglicherweise suchen-, die abhängig von Ihrer Verbindung und diese Melodie.

Die Click…(Funktion() überschreibt, was SharePoint getan hätte, wenn der Benutzer geklickt hat. Stellen Sie sicher, dass Sie "false zurück," Es wird deine Sachen zu tun und dann versuchen, die Href-Sache zu, Das ist sicherlich nicht Ihr Ziel.

Dies geschah und Test in einer SharePoint-online-Umgebung sollten aber funktionieren gut in 2010 und früher zu.

</Ende>

undefinedOnnieren Sie meinen Blog ab.

Folgen Sie mir auf Twitter bei http://www.twitter.com/pagalvin

Armer Mann ist in JavaScript Zwischenspeichern.

[TL;DR-version: Verwenden Sie Cookies zum Speichern der Ergebnisse der asynchrone Aufrufe; die Ergebnisse der letzten asynchrone Aufrufe sofort gerendert, und überprüfen sie dann nach dem Laden der Seite.]

Ich habe auf SharePoint-Intranet-Site für einen Client, dass die Funktionen gearbeitet, unter anderem, eine stilisierte Sekundärnavigation dessen Menüoptionen über eine normale alte benutzerdefinierte Liste verwaltet werden.  Die Idee besteht darin, dass der Client "ihre" Site-Menü steuern, ohne zu beeinflussen oder durch die globale Navigation löschte dadurch beeinträchtigt wird.

(Es ist etwas unglaublich subversiven zum Hinzufügen eines CEWP, der auf einer HTML-Datei verweist, das lädt einige CSS und JS grundlegend verändern fast alles über eine Website Verhalten... aber das ist für einen anderen Beitrag)

Der Code für diese ziemlich einfach:

Die Wunde Punkt hier ist das jedes Mal, wenn jemand eine der Seiten hits, Web-Browser des Benutzers greift Elemente aus der Liste abgerufen.  Sobald Dev vollständig und Tests sind bewährt Dinge zu stabil und vollständig sein, Dieser Aufruf ist unnötig mehr als 99% die Zeit, da das Menü nur selten ändert.  Es hat auch einen seltsamen UI Affekt, der in dieser schönen neuen Welt von hyper-Ajaxy Websites üblich ist – die Seite macht und erst dann rendert das Menü.  Es ist nervös und störend aus meiner Sicht.  Und nervös. Also, Zwischenspeichern. 

Ich änderte die Logik Wasserverbrauch:

  • Suchen Sie ein Cookie im Browser, der Menü enthält, wie ich es zuletzt gelesen
    • Wenn gefunden, machen Sie es sofort.  Warten Sie nicht auf die Seite geladen.  (Sie müssen sicherstellen, dass Ihre HTML hier strategisch ist, aber es ist nicht schwer zu tun).
  • Warten Sie, bis die Seite fertig geladen und machen ein Async aufrufen, um Menüelemente aus einer Liste mit REST oder lists.asmx oder was auch immer zu laden
  • Vergleichen Sie, was ich mit dem cookie
    • Wenn es passt, STOP
    • Ansonsten, mithilfe von jQuery, ein paar dynamisch zu füllen, wenn <Li>ist in einem <UL>
  • Verwenden Sie CSS, um die Formatierung zu tun
  • Gewinn!

Einige von Ihnen werden sagen, "hey! Es gibt kein richtiger Zwischenspeichern hier da du sowieso das Menü liest jedes Mal.”  Und du hast Recht-ich gebe nicht dem Server jede Art von Bruch.  Aber weil der Aufruf asynchron und geschieht, nachdem die Seite erste ist rendert HTML-Nutzlast voll, es "fühlt"sich stärker auf den Benutzer.  Das Menü macht ziemlich viel wie die Seite zieht.  Wenn das Menü zur Änderung geschieht, der Benutzer wird eine unruhige neu zu ziehen des Menüs unterzogen, aber nur dieses eine Mal.

Es gibt einige Möglichkeiten, um diese Zwischenspeicherung effizienter und helfen den Server zur gleichen Zeit:

  • Setzen Sie in der Regel, dass der "Cookiecache" gültig für einen Mindestaufenthalt von ist 24 Stunden oder einige andere Zeitrahmen. Solange es keine abgelaufene cookie, Verwenden Sie das Cookie Menü Snapshot und nie schlagen Sie den server.

Nun... das ist alles, die was gerade in den Sinn kommen :). 

Wenn jemand hier eine clevere Idee hat würde ich gerne kennenlernen.

Und schließlich – kann diese Technik für andere Sachen verwendet werden.  Dieser Client-Seite hat eine Reihe von datengesteuerten Dingen auf verschiedenen Seiten, viele von ihnen ändern relativ selten (wie einmal pro Woche oder einmal im Monat).  Wenn Sie bestimmte Bereiche der Funktionalität gezielt, Sie können eine reaktionsschnellere Benutzeroberfläche geben, ziehen Inhalte aus dem lokalen Cookie laden und Rendern sofort.  Es fühlt sich schneller an den Benutzer, auch wenn Sie nicht den Server Schleifen speichern.  Sie können sparen Sie die Serverzyklen bei Entscheidung über einige Bedingungen und Auslöser dieser lokalen Cookiecache für ungültig erklären.  Das ist alles situationsabhängig und künstlerisch Zeug und wirklich am meisten Spaß :). 

</Ende>

undefinedOnnieren Sie meinen Blog ab.

Folgen Sie mir auf Twitter bei http://www.twitter.com/pagalvin