AngularJS为路由内定义的控制器预先提供$ params变量

时间:2012-08-21 17:24:17

标签: angularjs

是否可以在AngularJS中的已定义路径中传递您自己的变量?

我这样做的原因是因为我必须对同一页面的数据表示(一个是根据JSON数据的过滤视图),我需要做的就是给$ params一个布尔标志数组,让控制器功能知道该页面被过滤或未过滤。

这样的事情:

var Ctrl = function($scope, $params) {
  if($params.filtered) {
    //make sure that the ID is there and use a different URL for the JSON data
  }
  else {
    //use the URL for JSON data that fetches all the data
  }
};

Ctrl.$inject = ['$scope', '$routeParams'];

angular.modlule('App', []).config(['$routeProvider', function($routes) {

  $routes.when('/full/page',{
    templateURL : 'page.html',
    controller : Ctrl
  });

  $routes.when('/full/page/with/:id',{
    templateURL : 'page.html',
    controller : Ctrl,
    params : {
      filtered : true
    }
  });

}]);

4 个答案:

答案 0 :(得分:21)

根据$routeProvider documentationroute的{​​{1}}参数具有属性$routeProvider.when()

  

应该注入控制器的可选依赖关系图。

这样的事情应该有效:

resolve

答案 1 :(得分:1)

AFAIK目前无法为路线指定其他参数。说完这个之后,可以通过测试if来轻松覆盖您的用例:id被定义为$routeParams的一部分。

问题是AngularJS会在'/ full / page'或'/ full / page / with /:id'上匹配你的路由,所以只需在你的控制器中测试$ routeParams的id存在:

if ($routeParams.id)

你知道在哪种情况下。

另一种方法是为不同的路线使用不同的控制器。

答案 2 :(得分:0)

像这样的方法必须适用于过滤器:

function caseFilterCtrl($scope, $routeParams, $http) {
    $http.get('./data/myDatas.json').success( function(data){
                                        var arr = new Array();
                                        for(var i=0; i < data.length; i++){
                                            if(data[i].filter == $routeParams.id){
                                                arr.push(data[i]);                              }
                                            }
                                        $scope.filtered= arr;
                                        });
    }

 caseFilterCtrl.$inject = ['$scope', '$routeParams', '$http']; //for minified bug issue

和路线:

angular.module('myFilterApp', []).
    config(['$routeProvider', function($routeProvider){ 
                $routeProvider.when('/filter/:id', {templateUrl: './view/partial/filter.html', controller: caseFilterCtrl});
                $routeProvider.otherwise({redirectTo: '/filter/01'});
            }
            ]);

答案 3 :(得分:0)

您可以直接通过$route.current.$$route获取潜行参数。

function Ctrl($scope, $route) {
  var filtered = $route.current.$$route.params.filtered;
}

angular.modlule('App', []).config(['$routeProvider', function($routeProvider) {

  $routeProvider.when('/full/page/with/:id',{
    templateURL: 'page.html',
    controller: Ctrl,
    params : {
      filtered : true
    }
  });

}]);

虽然它有用,但我还是更喜欢resolve解决方案。 <{1}}(或您选择的任何名称)可能会在将来的版本中被angularjs覆盖。