Durante lo sviluppo di App per SharePoint 2013 e Office 365, soprattutto quando si utilizzano le App di tipo "SharePoint Hosted", è d'obbligo leggere i valori passati in querystring tramite Javascript in quanto SharePoint utilizza la querystring per passare all'App un pò di informazioni tra cui:
- SPHostUrl - L'indirizzo del sito SharePoint dal quale è stata installata la vostra App
- SPAppWebUrl - L'indirizzo autogenerato per la vostra App (vedi questo post per maggiori info)
Solitamente i valori di questi due parametri vengono utilizzati per utilizzare le classi del Client Object Model (JSOM) e accedere ai contenuti o ai servizi esposti dall'Host Web o dall'App Web stesso.
Vi lascio qui uno snippet di codice Javascript per leggere questi parametri, in maniera un pò più intelligente rispetto a ciclarsi ogni volta la collezione
'use strict'; window.D4S = window.D4S || {}; window.D4S.SP2013 = window.D4S.SP2013 || {}; window.D4S.SP2013.Utils = window.D4S.SP2013.Utils || {}; window.D4S.SP2013.Utils = (function () { var queryStringManagerInstance; function initQueryStringManagerInstance() { //internal object used to store querystring values var values = {}; function storeQuerystrings() { //reads values from querystring and store locally var querystringsUrl = window.location.search.substring(1); var querystrings = querystringsUrl.split('&'); for (var i = 0; i < querystrings.length; i++) { var querystring = querystrings[i].split('='); values[querystring[0]] = decodeURIComponent(querystring[1]); } }; storeQuerystrings(); //the object will invoke this function only once return { //get querystring value using its key Get: function (name) { return values[name]; }, //check if querystrings contains a specific key Contains: function (name) { return values[name] !== null; } }; }; //singleton implementation function getQueryStringManagerInstance() { if (!queryStringManagerInstance) { queryStringManagerInstance = initQueryStringManagerInstance(); } return queryStringManagerInstance; }; return { QueryStringManager: getQueryStringManagerInstance() } })();
Questo oggetto è stato creato attraverso l'utilizzo del pattern Singleton.
Perchè? Semplicemente perchè volevo essere sicuro di leggere e salvarmi in memoria i valori presenti in querystring solamente una volta durante l'esecuzione della mia applicazione, pur accedendo a tali valori tutte le volte che la mia applicazione lo necessitava.
E' proprio questo il compito di un Singleton, si assicura che esista solamente una singola istanza di una classe durante l'esecuzione dell'applicazione.
E' proprio questo il compito di un Singleton, si assicura che esista solamente una singola istanza di una classe durante l'esecuzione dell'applicazione.
Quindi, utilizzando l'oggetto appena descritto in questo modo:
var hostUrl = D4S.SP2013.Utils.QueryStringManager.Get('SPHostUrl'); var appUrl = D4S.SP2013.Utils.QueryStringManager.Get('SPAppWebUrl');
Sono certo che il ciclo for sulla collezione di querystring viene eseguito solo una volta, anche se accedo due volte ai valori recuperati dalla querystring.
Vi può sembrare un'eccesso di zelo forse, ma vi assicuro che fare attenzione a questi particolari nello sviluppo front-end delle vostre applicazioni vi può portare solo benefici.