2013-04-29 3 views
29

Sto usando angolare in un'applicazione che è, fondamentalmente, una tabella con risultati di ricerca. accesso a questa tabella può essere raggiunto tramite un URL come http://myapp/?client=clientName

Un controller angolare è istanziata per la tavola, tra le altre cose, per aprire una finestra di dialogo modale (anche angolare-based con bootstrap-ui) con i dettagli della riga.

Questi dettagli di riga sono portati tramite un servizio che ha alcune funzionalità comuni per entrambi i controller: quello per il tavolo e quello per il modale.

Ora, all'interno di questo servizio, ho il seguente frammento di codice per recuperare:

service.fetchRelatedElements = function(element, cb) { 
    var url = '/search.json?results=20&type='+element.type; 
    if ($location.search()['client']) { 
    url += '&client=' + $location.search('client'); 
    } 
    return doFetch(url, cb); // actual server json GET 
}; 

L'obiettivo è quello di sapere se la tabella ha già questa specifica client parametro impostato come un filtro.

Se inserisco un punto di interruzione all'inizio di questa chiamata, vedo che $location.absUrl() restituisce l'URL del browser corrente (che, nel mio caso, ha il parametro client a cui sono interessato).

Ma $location.search() restituisce un oggetto vuoto.

Sto inserendo il servizio $ posizione all'interno del mio servizio con i valori predefiniti (ovvero, non configurandolo tramite una chiamata .config()). E, come doc dice:

Il $ servizio di localizzazione analizza l'URL nella barra degli indirizzi del browser (in base sulla window.location) e rende l'URL disponibili per l'applicazione .

Mi manca qualcosa? Non dovrebbe l'URL, a questo punto, essere analizzato?

Grazie!


UPDATE: sono riuscito a farlo funzionare. Il problema era esattamente che non stavo configurando affatto il servizio. L'ho fatto perché pensavo che in quel modo ci sarebbero state delle impostazioni predefinite, ma sembra che non sia così che funziona.

+0

Puoi condividere l'output di $ location.absUrl()? Questo ha un odore come un problema di regexp. – Jmr

+0

Sicuro! È 'http: // localhost: 3000/results? Utf8 =% E2% 9C% 93 & client = mond & type = & submittedLowerBound = & submittedUpperBound = & commit = Filter'. È un'app per rails sul back-end. – Pipetus

+4

Puoi condividere del codice per la tua soluzione? Sto avendo lo stesso problema dove $ location.search() restituisce {} – sthomps

risposta

42

ho avuto lo stesso problema prima ho configurato $locationProvider nel modulo di configurazione del mio app:

appModule.config(['$locationProvider', function($locationProvider) { 
     $locationProvider.html5Mode(true); 
    }]); 
+3

in questo modo angolare ricadrà all'URL hashbang se il browser non supporta la modalità html5, dal modo in cui qualcuno sa come ottenere parametri di query senza la modalità html5 e il router in angolare? –

+0

sì, per la modalità HTML5 funziona bene, ma il fallback non riesce ancora .. – Magne

+1

Nota anche che quando lo si imposta su html5Mode, è necessario anche avere un tag di base nel file html. –

3

L'API per $ location.search è piuttosto confusa. Chiamare

$location.search('client'); 

imposterà l'oggetto di ricerca su {client: true} e restituirà $ posizione. Inoltre, hai un errore di battitura client invece di 'client', quindi sta impostando la ricerca su un oggetto vuoto. Quindi probabilmente si desidera:

url += '&client=' + $location.search()['client']; 
+0

Grazie, Jmr, ho corretto l'errore di battitura. Ma la cosa importante è che, a quel punto, '$ location.search()' restituisce solo '{}'. – Pipetus

+0

Scusa, ho perso il punto di interruzione all'inizio della domanda, pensavo che forse $ location.search (client) lo stesse sovrascrivendo. In questo caso non sono sicuro di cosa sta succedendo, $ location.search() analizza bene l'URL sulla mia macchina. – Jmr

3

È possibile scrivere una funzione che analizza il $ window.location.ricerca in base alle questo commento https://github.com/angular/angular.js/issues/7239#issuecomment-42047533

function parseLocation(location) { 
    var pairs = location.substring(1).split("&"); 
    var obj = {}; 
    var pair; 
    var i; 

    for (i in pairs) { 
     if (pairs[i] === "") 
      continue; 

     pair = pairs[i].split("="); 
     obj[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]); 
    } 

    return obj; 
} 

$scope.query = parseLocation($window.location.search)['query']; 
5

Quando ho incontrato questo problema, un'altra cosa che ha funzionato per me oltre l'impostazione della configurazione è di aggiungere "#" davanti alla stringa di query.

Quindi, se tu sei quella di creare la stringa di query, quindi modificando
myapp/?client=clientName
a
myapp/#?client=clientName

permesso $ location.search() per darmi un oggetto non vuoto che è quindi possibile l'accesso ogni parametro utilizzando $location.search()['client']

+1

Grazie. Questo commento dovrebbe essere nella documentazione ufficiale. :) – under5hell

9

Se non si desidera specificare il tag base, è possibile specificare require base false.

myapp.config(function($locationProvider) { 
    $locationProvider.html5Mode({ 
     enabled: true, 
     requireBase: false 
    }); 
});