2017-05-04 58 views
1

我对多个视图使用相同的控制器。我想根据所采用的路线对控制器进行参数化。AngularJS:通过路径参数化控制器

视图基本上显示相同的角度ui网格,因此是相同的控制器。然而,在一个视图中,我想预过滤特定数据的网格,而在另一个视图中,我没有。

我该怎么做?

app.config(function ($routeProvider) { 
    $routeProvider 
     .when('/foo', 
      { 
       controller: 'Ctrl', 
       templateUrl: '/foo.html', 
      }) 
     .when('/bar', 
      { 
       controller: 'Ctrl', 
       templateUrl: '/bar.html', 
      }); 
}); 

app.controller('Ctrl', ['$scope' function ($scope) { .. }]); 
+0

你是什么意思参数化 –

+0

更新了这个问题更具体。 – hansi

回答

1

在基础层面上,你可以检查current route看到正在使用什么模板和分支关闭这一点。

app.controller('Ctrl', function($route) { 
    if ($route.current.templateUrl === '/foo.html') { 
    doFoo(); 
    } else { 
    doBar(); 
    } 
}); 

这只有在您为每条路线使用不同模板时才有效。如果您想重新使用相同的模板,则resolve property of the route非常有用。

app.config(function($routeProvider) { 
    $routeProvider.when('/foo', { 
    controller: 'Ctrl', 
    templateUrl: '/foo.html' 
    resolve: { 
     whichRoute: function() { return 'foo'; } 
    } 
    }); 
}); 

app.controller('Ctrl', function(whichRoute) { 
    if (whichRoute === 'foo') { 
    doFoo(); 
    } else { 
    doBar(); 
    } 
}); 

而且比这还要好,resolve性能可以接受返回值承诺的功能,让你可以做数据的预过滤在那里。

app.config(function($routeProvider) { 
    $routeProvide.when('/foo', { 
    controller: 'Ctrl', 
    templateUrl: '/foo.html', 
    resolve: { 
     dataToDisplay: function(YourDataService) { 
     return YourDataService.getSomeData(); 
     } 
    } 
    }); 
}); 

app.controller('Ctrl', function(dataToDisplay) { 
    doTheThing(dataToDisplay); 
}); 
+0

谢谢!正是我在找的东西。 – hansi

2

想想那样。 两条路线都是一样的,只有一条路由器有一个过滤器,一条没有。因此在现实中它与附加参数filter='some'原路权利,使您的配置可能是这样的:

app.config(function ($routeProvider) { 
$routeProvider 
    .when('/foo/:filter?', 
     { 
      controller: 'Ctrl', 
      templateUrl: '/foo.html', 
     }) 
}); 

和控制器你必须$routeParams.filter问号将是一个可选的参数。然后在Ctrl中,您只需查找过滤器参数并使用过滤器进行适当渲染即可。 顺便说一句,你的看法可以保持不变,只是过滤你的网格。如果filter参数不存在,它只会返回相同的数据(未过滤)

希望有帮助。

+0

这是正确的做法。另一个答案是角度的hacky。可选的查询参数是要走的路。 – chairmanmow