【发布时间】:2013-10-25 23:05:02
【问题描述】:
我需要一些帮助,使我对这个问题的解决方案更加优雅。
应用摘要
该应用是使用 pushstate 的单页应用。登录页面(路径:/)包含文章链接(路径:/article/:articleId)。还有一个创建文章的链接(路径:/create)。单击任一链接时,URL 会发生变化,内容会加载到模式中(我使用的是 Bootstrap,但实现完全无关)。
解决方案
到目前为止,我已经完成了(请原谅我在盲目编码时出现的错误):
index.htm
<!doctype html>
<html ng-app="App">
<head>
<title>{{page.title}}</title>
</head>
<body>
<section id="articles" ng-controller="HomepageCtrl">
<ul>
<li ng-repeat="article in articles">
<a href="/article/{{article.id}}">{{article.name}}</a>
</li>
</ul>
</section>
<!-- markup simplified for example -->
<modal id="modal">
<div class="content ng-view></div>
</modal>
</body>
</html>
app.js
angular.module('Application', [], ['$routeProvider', '$locationProvider', function($routeProvider, $locationProvider) {
$routeProvider.when('/article/:articleId', {
templateUrl : '/templates/article.htm',
controller : 'ArticleCtrl'
}).when('/create', {
templateUrl : '/templates/create.html',
controller : 'CreateCtrl'
});
$locationProvider.html5Mode(true);
}]).controller('HomepageCtrl', ['$scope', '$rootScope', function($scope, $rootScope) {
$rootScope.page = {
title : 'This is the homepage'
};
$scope.articles = [];
$scope.articles.push({
id : 1,
name : 'Interesting article'
});
}]).controller('ArticleCtrl', ['$scope', '$rootScope', '$routeParams', function($scope, $rootScope, $routeParams) {
$('#modal').modal();
$rootScope.page = {
title : 'This is article {{article.name}}' /* Not sure if this works! */
};
}]).controller('CreateCtrl', ['$scope', '$rootScope', function($scope, $rootScope) {
$('#modal').modal();
$rootScope.page = {
title : 'This is the article creation form'
};
}]);
模板省略。
问题
虽然此解决方案有效,但效果不佳。主页内容保留在后台,与模态内容分离,这很好。当路由匹配时,检索模板内容并点击控制器,模式打开显示内容(ng-view)。这也很好。但是,我认为控制器不应该打开模式。
这样做最优雅的方式是什么?将内容路由到具有独特控制器的模式中的概念对应用程序很重要:将添加更多页面,这些页面都需要遵循此约定。还有其他警告,例如浏览器后退按钮和关闭模式应该让用户返回主页,但这些现在不太重要。一旦我了解了该逻辑的位置以及它如何与控制器交互,我就会很高兴。
【问题讨论】:
-
检查 angular-ui 模态组件。它创建了一个更好的抽象,并有一个
$modal服务,可以在控制器中用于打开和关闭模式。 angular-ui.github.io/bootstrap -
您不应该使用 jQuery -
$('#modal').modal()在控制器内部进行 DOM 操作,尤其是因为模态标记超出了ng-view中的控制器范围
标签: javascript angularjs modal-dialog twitter-bootstrap-3