2012-08-13 27 views
49

Necesito la ruta actual desde url en la plantilla (contenido de $ location.path). Pero no a través del controlador, porque tengo muchos controladores (y no quiero duplicar la declaración de $scope.currentUrl = $location.path;). Gracias por el consejo.

Respuesta

88

La plantilla AngularJS solo puede ver lo que está disponible en un ámbito, por lo que necesitará de alguna manera poner $ servicio de localización en un ámbito. Hay un alcance que siempre está disponible en la aplicación AngularJS llamado $ rootScope, por lo que podría usarse para su caso de uso.

Lo que podría hacer es utilizar el método run() de un módulo para exponer $ ubicación en el $ rootScope:

var myApp = angular.module('myApp', []).run(function($rootScope, $location) { 
    $rootScope.location = $location; 
}); 

esto haría 'ubicación' disponible en todas las plantillas de modo más adelante se podría hacer en su plantilla:

Current path: {{location.path()}} 
+1

En una plantilla de directiva que tiene su propio alcance, debe usar 'Ruta actual: {{$ parent.location.path()}}' – benweet

+0

Es una buena costumbre usar '{{$ root.location. xxx}} 'ya que cualquier directiva con un alcance aislado no tendría acceso a ella mediante el método abreviado y el' $ parent.location' no es confiable según la profundidad de su alcance. '$ root' siempre funciona. –

0

Una alternativa es utilizar el más semántica y versátil ui-router, a continuación, en el controlador, retrieve the current state, y almacenarla en la $scope:

app.controller('MyCtrl', ['$scope', '$state', function MyCtrl($scope, $state) { 
    $scope.state = $state.current.name; 
    ... 
} 
+0

¿Por qué los votos a favor, si puedo preguntar? –

+0

funcionó bien para mí. –

+0

Creo que los votos a favor son tal vez porque incluso si OP usaba ui-router (y este problema por sí solo no es razón suficiente para migrar) esto devuelve el nombre de estado, que es completamente diferente al de la URL (que también incluirá cualquier dinámica params). Por ejemplo, en mi aplicación, para la ruta: "/ graphs/56ce3/edit", su código devuelve el nombre del estado, "edit.graph". En palabras de Hipérbole y Half "No, mira, esa solución es para un problema diferente al que tengo". :) – 0x24a537r9

Cuestiones relacionadas