Posizione AngularJS $ che non modifica il percorso

Ho un problema con la modifica dell’URL della pagina dopo che un modulo è stato inviato.

Ecco il stream della mia app:

  1. I percorsi sono impostati, l’URL è riconosciuto in qualche pagina del modulo.
  2. Pagina carica, il controller imposta le variabili, le direttive vengono triggerste.
  3. Viene emessa una direttiva di forma speciale che esegue una sottomissione di modulo speciale utilizzando AJAX.
  4. Dopo l’esecuzione di AJAX (Angular non si occupa di AJAX), viene $scope.onAfterSubmit una richiamata e la direttiva chiama la funzione $scope.onAfterSubmit che imposta la posizione.

Il problema è che dopo aver impostato la posizione non succede nulla. Ho provato a impostare anche la posizione param in / … No. Ho anche provato a non inviare il modulo. Niente funziona.

Ho testato per vedere se il codice raggiunge la funzione onAfterSubmit (che fa).

Il mio unico pensiero è che in qualche modo l’ambito della funzione è cambiato (dal momento che è chiamato da una direttiva), ma poi come può chiamare su onAfterSubmit se l’ambito è cambiato?

Ecco il mio codice

 var Ctrl = function($scope, $location, $http) { $http.get('/resources/' + $params.id + '/edit.json').success(function(data) { $scope.resource = data; }); $scope.onAfterSubmit = function() { $location.path('/').replace(); }; } Ctrl.$inject = ['$scope','$location','$http']; 

Qualcuno può aiutarmi, per favore?

Ho avuto un problema simile qualche giorno fa. Nel mio caso il problema era che ho cambiato le cose con una libreria di terze parti (jQuery per la precisione) e in questo caso, anche se si chiamano funzioni e si impostano le variabili, Angular non riconosce sempre che ci sono cambiamenti, quindi non digerisce mai.

$ apply () è usato per eseguire un’espressione angular dall’esterno della struttura angular. (Ad esempio dagli eventi DOM del browser, setTimeout, XHR o librerie di terze parti).

Prova ad usare $scope.$apply() subito dopo aver cambiato il luogo e chiamato replace() per far sapere ad Angular che le cose sono cambiate.

Invece di $ location.path (…) per cambiare o aggiornare la pagina ho usato la $window service, in Angular questo servizio è usato come interfaccia per l’object window e l’object window contiene una location proprietà che ti permette di gestire operazioni relative all’ubicazione o alle informazioni sugli URL.

Ad esempio, con window.location puoi assegnare una nuova pagina, come questa:

 $window.location.assign('/'); 

Oppure aggiorna, in questo modo:

 $window.location.reload(); 

Ha funzionato per me. È un po ‘diverso da quello che ti aspetti, ma funziona per l’objective prefissato.

Ho avuto lo stesso problema, ma la mia chiamata a $ posizione era GIÀ entro un digest. La chiamata $ apply () ha appena dato un $ digest già in errore di processo.

Questo trucco ha funzionato (e assicurati di iniettare $location nel tuo controller):

 $timeout(function(){ $location... },1); 

Anche se non ho idea del perché fosse necessario …

Ho dovuto incorporare la mia dichiarazione $location.path() questo modo perché il mio digest era ancora in esecuzione:

  function routeMe(data) { var waitForRender = function () { if ($http.pendingRequests.length > 0) { $timeout(waitForRender); } else { $location.path(data); } }; $timeout(waitForRender); } 

Nel mio caso, il problema era l’indicatore di parametro opzionale (‘?’) Mancante nella configurazione del mio modello.

Per esempio:

 .when('/abc/:id?', { templateUrl: 'views/abc.html', controller: 'abcControl' }) $location.path('/abc'); 

Senza il carattere dell’interrogazione, la rotta ovviamente non cambierebbe sopprimendo il parametro del percorso.

Se qualcuno di voi utilizza Angular-ui / ui-router, utilizzare: $state.go('yourstate') anziché $location . Ha fatto il trucco per me.

Questo funziona per me (in CoffeeScript)

  $location.path '/url/path' $scope.$apply() if (!$scope.$$phase) 
 setTimeout(function() { $location.path("/abc"); },0); 

dovrebbe risolvere il tuo problema.