我肯定会为每个操作推荐单独的 URL(以启用直接链接)。你建议的那些看起来不错。
在 AngularJS 中,您可以将$route
服务与ngView
指令结合使用,为每个操作加载适当的模板,并为您处理浏览器位置和历史机制。
AngularJS 教程的第 7 步给出了一个使用视图、路由和模板的例子,我在这里描述的方式。以下是您的示例的简化版本:
定义路线
在您的主应用程序脚本(例如app.js)中:
angular.module('AthletesApp', []).
config(['$routeProvider', function($routeProvider, $locationProvider) {
// Configure routes
$routeProvider.
when('/athletes', {templateUrl: 'partials/athletes-list.html', controller: AthleteListCtrl}).
when('/athletes/:athleteId', {templateUrl: 'partials/athlete-detail.html', controller: AthleteDetailCtrl}).
when('/athletes/:athleteId/edit', {templateUrl: 'partials/athlete-edit.html', controller: AthleteEditCtrl}).
when('/athletes/:athleteId/new', {templateUrl: 'partials/athlete-new.html', controller: AthleteNewCtrl}).
otherwise({redirectTo: '/athletes'});
// Enable 'HTML5 History API' mode for URLs.
// Note this requires URL Rewriting on the server-side. Leave this
// out to just use hash URLs `/#/athletes/1/edit`
$locationProvider.html5Mode(true);
}]);
我们还为 URL 启用了“HTML 模式”,请参见下面的注释。
2. 在您的 HTML 中添加ngView
指令
在您的主index.html中,您指定所选部分模板在整体布局中的位置:
<!doctype html>
<html ng-app="AthletesApp">
...
<!-- Somewhere within the <body> tag: -->
<div ng-view></div>
...
</html>
3. 创建模板和控制器
然后为每个操作创建局部视图模板和匹配的控制器。例如,对于运动员详细信息视图:
部分/athelete-detail.html:
<div>
... Athete detail view here
</div>
运动员DetailCtrl.js:
angular.module('AthletesApp').controller('AtheleteDetailCtrl',
function($scope, $routeParams) {
$scope.athleteId = $routeParams.athleteId;
// Load the athlete (e.g. using $resource) and add it
// to the scope.
}
您可以通过服务访问路由参数(:athleteId
在路由配置中定义)$routeParams
。
4.添加链接
最后一步是在您的 HTML 中实际包含链接和按钮以访问不同的视图。只需使用标准 HTML 并指定 URL,例如:
<a href="/athletes/{{athleteId}}/edit">Edit</a>
注意:标准与哈希 URL
http://example.com/#/athletes
在不支持 HTML5 History API 的旧浏览器中,您的 URL 看起来更像http://example.com/#/athletes/1
.
该$location
服务(由 自动使用$route
)可以为您处理此问题,因此您可以在现代浏览器中获得漂亮干净的 URL,并在旧浏览器中回退到散列 URL。您仍然如上所述指定您的链接,$location
并将为旧客户处理重写它们。唯一的附加要求是您在服务器端配置 URL 重写,以便将所有 URL 重写到应用程序的主 index.html。有关更多详细信息,请参阅AngularJS $location 指南。