我正在尝试使用 Restful/Ruby convension 来构建我的应用程序/<resource>/[method]/[id]
。我以前在使用像 CodeIgniter 这样的服务器端 MVC 框架时是如何根据 URI 动态路由的:
前任。
www.foo.com/bar/baz/1
然后应用程序将使用baz
控制器/类中的方法bar
并返回views/bar/baz.php
(填充来自 的数据bar->baz
)
我想在 Angular 中做同样的事情,但我不确定它是否支持这一点(如果支持,我不确定该怎么做)。目前我正在使用$routeProvider
'swhen
方法来指定每种情况。$location.path()看起来它可能有我需要的东西,但我认为我不能在app.js
(within config()
) 中使用它。
我想做的是这样的:
.config([
'$routeProvider', function($routeProvider) {
$routeProvider
.when(//<resource> controller exists
resource+'/'+method, {
"templateURL": "views/" + resource + "/" + method + ".html",
"controller": resource
}
).otherwise({ "redirectTo":"/error" });
}
]);
并且路由器会自动调用相应的方法。
编辑另外,为什么$routeProvider在我指定时会发疯when('/foo/bar', {…})
?
编辑 2 Per Lee 的建议,我正在考虑做这样的事情:
$routeProvider
.when(
'/:resource/:method/:id', {
"templateUrl": function(routeParams){
var path = 'views/'+routeParams.resource+'/';
return ( typeof routeParams.method === 'undefined' ) ?
path+'index.html' : path+routeParams.method+'.html';
},
"controller": RESOURCE
})
.otherwise({redirectTo: '/error'});
我在$routeProvider的文档中注意到以下内容:
templateUrl – {string=|function()=} – 返回 ngView 应该使用的 html 模板路径的路径或函数。
如果templateUrl是一个函数,它将使用以下参数调用:
• {Array.<Object>} -通过应用当前路由从当前$location.path()中提取的路由参数
编辑:设置templateUrl
为函数的选项是不稳定的1.1.2版本的一部分:#1963(但它从 2013-02-07 起不起作用)。
有一个关于在 AngularJS 的 Github 上添加此功能的讨论:#1193 #1524,但我不知道它是否实际实现(在上面引用的 Dash 的文档中,它看起来已经实现了,并且网站上的文档还没更新)。
编辑 3为了澄清我想要发生的事情(根据李的要求),简单来说,我想去www.foo.com/index.html#/people
Angular 应该使用控制器people
,自动调用它的index
方法,并且应该提供服务
./views/people/index.html
./views/people/map.html
另外,如果我去www.foo.com/index.html#/people/map
Angular 应该people
再次使用控制器,但这次会自动调用它的map
方法并提供…map.html(因为在 url 中指定了地图)
./views/people/index.html
./views/people/map.html
然后,如果我去
www.foo.com/index.html#/widgets
Angular应该服务
./views/widgets/index.html
./views/widgets/details.html
路由器的代码应该非常通用——我不应该.when()
为每个路由指定一个。