如何在$ routeProvider中将变量传递给$ scope

时间:2014-07-04 17:46:16

标签: angularjs angularjs-scope

我需要在$ routeProvider中将变量传递给$ scope。代码如下:

.when('/:zone/edit/:id', {
      templateUrl: 'views/edit.html',
      controller: 'EditSet'
    })
    .when('/articles/edit/:id', {
      templateUrl: 'views/edit-article.html',
      controller: 'EditSet',
      params: {zone: 'articles'}
    })

要获得参数,我使用$scope.params.zone,它适用于第一种情况(:zone),而不适用于第二种情况。

在这种情况下我该怎么做?

2 个答案:

答案 0 :(得分:4)

所以我认为你最好使用templateUrl中的功能支持来实现这个目标:

.when('/:zone/edit/:id', {
    templateUrl: function(params) {
        if (params.zone == "article") {
            return 'views/edit-article.html';
        }

        return 'views/edit.html';   
    },
   controller: 'EditSet'
})

答案 1 :(得分:4)

在您指定的顺序中,第二条路线永远不会被解析。

/:zone/edit/:id将匹配:zone的任何值。因此,/articles/edit/:id将始终解析为/:zone/edit/:id/foo/edit/:id/asdhjkdajksa/edit/:id也是如此。

此外,params: {zone: 'articles'}不是路线的有效属性。如果在进入控制器之前需要设置数据,可以使用resolve属性(虽然我不确定在这种情况下你需要什么)。

.when('/articles/edit/:id', {
  templateUrl: 'views/edit-article.html',
  resolve: { zone: 'articles-zone' },
  controller: 'EditSet'
})
.when('/:zone/edit/:id', {
  templateUrl: 'views/edit.html',
  controller: 'EditSet'
})

我不知道$scope.params.zone是如何为您工作的,在您将$routeParams.zone注入控制器定义后应该是$routeParams。使用上述路由和此控制器,您将获得以下值:

angular.module('app').controller('EditSet', function($scope, $routeParams, zone) {
  console.log($routeParams.zone);
  console.log(zone);
});

/articles/edit/1
-> 'articles'
-> 'articles-zone'

/batman/edit/1
-> 'batman'
-> undefined

请查看the example docs,了解如何正确设置路线格式。