角度的URL标记

时间:2013-08-23 20:33:20

标签: javascript django angularjs

来自Django世界,我只是喜欢它关于URL的很酷的功能,它阻止我们在模板和文件中硬编码URL。的观点:

In urls.py:
url(r'/url/param1/param2/$', 'view_name', name="URL_NAME"),

In Template:
<a href="{% url "URL_NAME" @param1 &param2 ... %}">My link</a>

这样,如果我想更改此URL,我不必在多个文件中更改它。我想知道角度是否允许我们也这样做。现在我必须写这样的东西:

In my App: 
when('/home', {
        templateUrl: 'app/home/home.tpl.html'
    }).

In my view:
<a href='#/home'>my link</a>

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这是一个简单的解决方案。

首先,我在$ routeProvider配置中添加了视图的名称。 例如,我们将路径'/ login /:arg1 / with /:arg2'的名称定义为'view_name':

myApp.config(['$routeProvider', function($routeProvider) {
    $routeProvider.when('/login/:arg1/with/:arg2', {
            templateUrl: 'app/common/login/login.tpl.html',
            name: 'my_view_name'
        }).

然后我创建了一个指令,将您的视图名称动态转换为正确的URL:

myApp.directive('viewUrl', function ($route) {
    return {
        restrict: 'A',
        link: function (scope, elem, attrs) {
            var splitArgs = attrs.viewUrl.split(' ');
            var view_name = splitArgs.shift();
            var url="route not found";
            for(var route in $route.routes){
                if ($route.routes[route].name == view_name){
                    url = route;
                }
            }
            for (var arg in splitArgs) {
                keyValue = splitArgs[arg].split(':');
                url = url.replace(":"+keyValue[0], keyValue[1]);
            }
            elem.prop('href', url);
        }
    }
});

现在你可以在你的html组件中使用view-url属性:

<a view-url="my_view_name arg1:value1 arg2:value2">Hello World</a>

这会将href元素添加到您的链接中,您将得到以下结果:

<a view-url="my_view_name arg1:value1 arg2:value2" href="/login/value1/with/value2">Hello World</a>

在使用replace函数时,请注意参数的名称。