AngularJS反向路线

时间:2013-12-07 19:56:24

标签: angularjs

有没有办法通过$ routeProvider将URL附加到控制器,而不是硬编码href属性中的URL?如果修改$ routeProvider中的路由,则必须修改模板中所有硬编码的URL,这些URL效率不高。

例如,Django Framework提供了“reverse()”实用程序函数和“url”模板标记,它给出了“controller”(视图函数)和URL参数,它返回了相关的URL。

2 个答案:

答案 0 :(得分:3)

没有内置方法可以执行此操作,但您可以使用提供反向网址的angular.named-routes

$ routeProvider:

$routeProvider.when("/product/:id/:slug", {
    templateUrl: "/product.html",
    controller: "ProductController",
    name: "product-detail"
});

$locationProvider.html5Mode(true);

$范围

{product: {id: 1, name: "Awesome Product", slug: "awesome-product"}}

从模板反向执行:

<a data-named-route="product-detail" data-kwarg-id="{{ product.id }}" data-kwarg-slug="{{ product.slug}}">{{ product.name }}</a>

应该变成:

<a href="/product/1/awesome-product">Awesome Product</a>

答案 1 :(得分:0)

是的,但没有内置方法可以做到这一点。因为即使控制器可能绑定到$ routeProvider,它也不必。实现它的一种方法是使所有控制器继承自BaseController。这个BaseCtrl将属性“currentUrl”注入范围。

  myApp.controller("BaseCtrl" ,function ($scope, $location) {

  });

  myApp.controller("AnyCtrl" ,function ($scope, $location) {      

  //inherit from base
  $injector.invoke(function ($controller) { $controller('BaseCtrl', {$scope: $scope}); });

  });

实现它的另一种方法是每次路由更改时通过更改$ rootScope.currentUrl来“污染”(因此不是一个好主意但会起作用)$ rootScope。由于所有范围都继承自$ rootScope,因此变量$ scope.currentUrl将始终可用并且最新可用于您想要的任何视图。