archivi categoria: JavaScript

HTTP 406 Errore quando si utilizza $http.get angolare contro SharePoint resto punti finali

Aggiornamento: Marc AD ndersson ha sottolineato questo grande pezzo di informazioni: http://Blogs.Office.com/2014/08/13/JSON-Light-support-Rest-SharePoint-API-Released/. Questo spiega tante :).

Che può essere il peggior titolo di un post del blog mai! Anyhoo.

In genere faccio tutti i miei prototipi contro un'istanza di O365. Ho la mia istanza personale in modo che non devo preoccuparmi che colpisce chiunque altro. Come una digressione – ricorda quando chiamiamo trasportati intorno macchine virtuali sui nostri computer portatili con MOSS – SQL Server, IIS, decidendo vs Hyper-V. VMWare? Anyhoo...

Avevo sviluppato un app utilizzando angolare in questo ambiente che fa, tra le altre cose, Questo:

$http.Get(serverUrl)
.successo(funzione(dati, status, intestazioni, config) {

var getLinksResponse = dati;

getLinksResponse.value.forEach(funzione(theResult) {

// e così via e così schiuma

Questo stava lavorando bene in due diversi ambienti di SharePoint online. Tuttavia, Quando il mio collega portato a un'istanza di Cloudshare, Egli fu sempre un HTTP 406 errore (che era la prima volta che ho mai avuto che uno, quindi... evviva, Suppongo). Abbiamo fatto un po' di ricerche e ho notato che l'intestazione "Accept" era spento. SharePoint online era perfettamente felice con:

Accettare: applicazione/json

Ma l'istanza cloudshare (che è SP su prem, ospitato in un server virtuale) ha voluto il classico "odata = verbose" aggiunto pure:

Accettare: applicazione/json;OData = verbose

Alle difficoltà che, Abbiamo aggiunto l'intestazione come tale:

var config = {intestazioni: {
'Accettare': ' applicazione/json;OData = verbose'
}
};

$http.Get(serverUrl,config)
.successo(funzione(dati, status, intestazioni, config) {

var getLinksResponse = dati;

getLinksResponse.value.forEach(funzione(theResult) {

// e così via e così schiuma

Che si è sbarazzato della 406, ma ha anche cambiato il formato della risposta. Era più... dettagliato. (ma ha anche cambiato il formato della risposta.  Era più... prolisso.!) Ulteriori cambiamenti sono stati richiesti ed ecco il risultato finale:

var config = {intestazioni: {
'Accettare': ' applicazione/json;OData = verbose'
}
};

$http.Get(serverUrl,config)
.successo(funzione(dati, status, intestazioni, config) {

var getLinksResponse = dati;

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

// e così via e così schiuma

Questo solo trasformato in una 30 problema minuto per noi, così siamo stati fortunati. Speriamo che qualcuno trova questo utile.

</fine>

Angolare non riesce per il Bootstrap in IE9

Sto giocando con Angular.js per l'ultimo lungo mentre e per la vita di me, NON ho potuto ottenere il mio apps angolare per lanciare in IE9.  Tutti funzionano bene in IE11 ma IE9 mostrerebbe solo le parentesi graffe e bit simile.

Cercato in giro e non poteva trovare qualcuno lamentava il suo problema.  Ha funzionato benissimo in Chrome, IE11, non solo IE9.

Ero gettato fuori dal fatto che la console di IE mi dava errori come questo:

SEC7111: Sicurezza HTTPS è compromessa da res://ieframe.dll/forbidframing.htm

Quell'errore mi aveva pensando che c'era qualche problema scaricando l'angolare o altre librerie che avevo bisogno.  Come si scopre, Questo non era il problema.

Di rovistando internets, Ho finalmente scoperto che dovevo cercare la frase era "bootstrap" e che sembrava che il bootstrap stava fallendo.  Alla fine, il mio problema era che io avevo decorato mia <html> Tag con l'attributo ng-app, come in:

<ng-app html = "MatrixApp">

Pozzo, che non ha funzionato per IE9.  Invece, Avvolto tutto il resto del codice HTML nella <corpo> all'interno di un div e riferimenti MatrixApp quel modo.

Problema risolto.

Speriamo che questo qualcuno fa risparmiare qualche dolore.

</fine>

Crescente consapevolezza / Adozione di framework JavaScript

Il mio collega, Javed Ansari (http://www.bigapplesharepoint.com/team?showExpertName=Javed%20Ansari&rsource=pgblog), ha scritto un breve post riepilogativo sui quadri egli ama o almeno ha utilizzato con con SharePoint: http://www.bigapplesharepoint.com/pages/View-An-Insight.aspx?BlogID=53&rsource=PGBlog).

jQuery sembra di essere stato il vincitore sul campo, per intenderci, da anni ormai, ma gli altri sono più nuovi e alambicchi sorta di lotta, come angolare. (SPServices, Naturalmente, da anni è un risparmiatore di vita e continuerà ad essere così penso).

Che cosa sono persone che usano? Essi sono concentrati più su utensili di Microsoft (CSOM / JSOM) o si spostano più verso angolare, Knockout, Ember, ecc?

Ho una crescente propensione verso questi quadri non Microsoft. Penso che la roba MSFT è più difficile e più difficile da lavorare con, che richiedono quasi come gran parte della curva di apprendimento come vecchio stile lato server dev.

Posta un commento qui o sopra a Grande mela SharePoint Se volete discutere (Grande mela avrà più probabilità di una buona discussione).

</fine>

Superare il fastidioso problema con gli URL relativi in lancio rapido di SharePoint

Volevo aggiungere un link per la navigazione veloce lancio l'altro giorno e mi ha detto che SharePoint:

image

Versione testo puro di che è:

Verificare che l'URL è valido e inizia con un carattere valido (cancelletto (#) o barra (/)) o un protocollo valido supportato (per esempio, ' http://’, ' https://’, ' file://’, ' ftp://’, ' mailto:’, ' notizie:’).

"Blech e pox!"Ho detto.

Una soluzione alternativa a questo è utilizzare JavaScript per trovare un link noto nel lancio rapido ed eseguire l'override del relativo comportamento.

Per testare questa, aggiungere un nuovo link al tuo sito di prova questa convenzione:

image

Ho usato jQuery. Per risolverlo, ottenere alcuni JavaScript e jQuery nella pagina utilizzando la vostra tecnica preferita e con una riga di codice come questo:

 

$(documento).pronto( funzione () {

    $("un:contiene('Test sostituzione URL')").fare clic su(funzione () { avviso("comportamento modificato Clicca!"); ritorno falso;});

});

E tuo zio Bob.

Il selettore di jQuery trova ogni <un> Tag che ha "Sostituzione del Test URL" nel suo nome. È possibile trovare-melodia che a seconda del tuo link e simili.

La Clicca(funzione() esegue l'override di qualsiasi SharePoint avrebbe fatto quando l'utente fa clic su. Assicurarsi che "return false", altrimenti sarà fare la tua roba e poi provare a href cosa troppo, che non è quasi certamente il vostro obiettivo.

Questo è stato fatto e prova in un ambiente di SharePoint online, ma dovrebbe funzionare bene in 2010 e all'inizio troppo.

</fine>

undefinedIscriviti al mio blog.

Seguimi su Twitter a http://www.twitter.com/pagalvin

Povero uomo di memorizzazione nella cache in JavaScript

[TL;Versione DR: utilizzare i cookie per memorizzare i risultati delle chiamate asincrone; rendere immediatamente i risultati delle precedenti chiamate asincrone e poi convalidarli dopo il caricamento della pagina.]

Sto lavorando sul sito intranet SharePoint per un cliente che caratterizza, tra le altre cose, una navigazione secondaria stilizzato cui opzioni di menu sono gestiti tramite un elenco personalizzato di vecchio regolare.  L'idea è che il cliente ottiene controllare il menu del "loro" sito senza influenzare o colpiti dalla navigazione globale messa da esso.

(c'è qualcosa di incredibilmente sovversiva sull'aggiunta di un CEWP che punta a un file HTML che carica alcuni CSS e JS per modificare sostanzialmente quasi tutto ciò che riguarda il comportamento di un sito... ma che è per un altro post)

Il codice per questo abbastanza semplice:

Qui il punto dolente è che ogni volta che qualcuno colpisce una delle pagine del sito, browser web dell'utente è protesa per ottenere elementi dall'elenco.  Una volta dev è completa e test ha dimostrato le cose per essere stabile e completa, Questa chiamata è inutile più di 99% del tempo poiché il menu cambia raramente.  Ha anche un effetto strano di UI che è comune in questo mondo nuovo iper-ajaxy siti web – il rendering della pagina e solo allora esegue il rendering dal menu.  È nervosa e fastidioso a mio parere.  E nervosa. Così, memorizzazione nella cache. 

Ho modificato la logica di questa convenzione:

  • Cercare un cookie nel browser che contiene il menu come ultima leggerla
    • Se trovato, rendere immediatamente.  Non aspettare che la pagina completare il caricamento.  (È necessario assicurarsi che il codice HTML è strategicamente collocato qui, ma non è difficile da fare).
  • Attendere la pagina di finire il caricamento e fare un async chiamare per caricare le voci di menu da un elenco utilizzando il resto o lists o qualunque
  • Confrontare quello che ho ottenuto con il cookie
    • Se corrisponde a, FERMATA
    • In caso contrario, usando jQuery, popolare dinamicamente un mazzo se <li>di in un <UL>
  • Utilizzare i CSS per fare la formattazione
  • Profitto!

Alcuni di voi stanno andando a dire, "Ehi! non non c'è nessun reale cache succedendo qui dato che stai leggendo il menu comunque ogni singola volta.”  E hai ragione-non sto dando il server qualsiasi tipo di pausa.  Ma perché la chiamata è async e accade dopo che la pagina iniziale di payload HTML rende pienamente, ci si "sente" più reattivo all'utente.  Il menu rende abbastanza tanto come disegna la pagina.  Se il menu succede al cambiamento, l'utente è soggetto a un ri-disegnare nervosa del menu, ma solo che una volta.

Ci sono alcuni modi per rendere più efficace questa memorizzazione nella cache e il server possono aiutare allo stesso tempo:

  • Mettere in una regola che il "cookie cache" è valida per un minimo di 24 ore o qualche altro lasso di tempo. Finchè non non c'è alcun cookie scaduti, utilizzare snapshot menu del cookie e mai colpito il server.

Beh... questo è tutto quello che mi vengono in mente ora :). 

Se qualcuno ha qualche idea intelligente qui mi piacerebbe conoscerli.

E infine – questa tecnica può essere utilizzata per altre cose.  Pagina su questo client ha un certo numero di cose basate su dati sulle varie pagine, molti di loro modifica relativamente raramente (come una volta a settimana o una volta al mese).  Se destinazione specifiche aree di funzionalità, si può dare un'interfaccia utente più reattiva tirando il contenuto dall'archivio locale cookie e rendendo immediatamente.  Ci si sente più velocemente all'utente anche se non si sta salvando il server qualsiasi cicli.  Si può salvare i cicli server decidendo su alcune condizioni e trigger per invalidare questa cache cookie locale.  Che è tutto situazionale e artsy roba e veramente la più divertente :). 

</fine>

undefinedIscriviti al mio blog.

Seguimi su Twitter a http://www.twitter.com/pagalvin