将AngularJS应用程序拆分为更小的部分/模块的最佳方法是什么?例如,如果我有博客文章和评论启用,我想我可以将其分解为像“posts”和“comments”(?)(可能不是最好的例子,但想法是将应用程序逻辑拆分为单独的模块而不是构建一个巨大的单模块应用程序。)
我尝试在单独的DOM节点中引导两个模块,并相应地在两个模块中使用路由。几乎没有问题:
的index.html
<div class="post"><ng-view></ng-view></div>
<div class="comments"><ng-view></ng-view></div>
javascript.js
angular.module('posts', []).config(['$routeProvider', function ($routeProvider) {
$routeProvider
.when('/', {
'template': 'Showing all the posts',
'controller': 'postCtrl
})
.when('/post/:id', {
'template': 'Showing post :id',
'controller': 'postCtrl
});
}]);
angular.module('comments', []).config(['$routeProvider', function ($routeProvider) {
$routeProvider.when('/post/:id', {
'template': 'Showing post :id comments',
'controller': 'CommentsCtrl'
});
}]);
angular.bootstrap($('.post'), ['posts']);
angular.bootstrap($('.comments'), ['comments']);
答案 0 :(得分:21)
我会在“视图模块”和这些子模块中划分应用程序。
然后我使用$ routeProvider在视图之间切换。我在每个模块中定义了不同的路由配置。
如果我需要更多子模块,我可以使用ng-include加载这些子模块。
/* App Module */
angular.module('MyApp', ['MyApp.home', 'MyApp.blog'])
.config( function myAppConfig ( $routeProvider ) {
'use strict';
$routeProvider.otherwise({ redirectTo: '/home' });
});
/* home Module */
angular.module('MyApp.home', [])
.config(['$routeProvider', function config( $routeProvider ) {
$routeProvider.when('/home', {
controller: 'HomeController',
template: '<p>This is my Home</p>'
});
}]);
我在github上创建了一个小存储库来解释这一点。
答案 1 :(得分:6)
您可以在子模块中定义路线:
angular.module('app', ['ngRoute', 'app.moduleX'])
.config(function($routeProvider, $locationProvider) {
$routeProvider.when('/home', {
templateUrl: 'partials/home.html',
controller: 'HomeCtrl'
});
//Handle all exceptions
$routeProvider.otherwise({
redirectTo: '/home'
});
})
angular.module('app.moduleX', []).config(function($routeProvider) {
$routeProvider.when('/settings', {
templateUrl: 'partials/settings.html',
controller: 'SettingsCtrl'
});
})
我还写了关于这个主题的a blog post。
答案 2 :(得分:2)
我们正在做类似于门户网站应用和子应用的事情。我们发现了一些事情:
因为只有一个应用程序可以拥有路由,所以应该按顺序引导应用程序。所以像这样:
$( function () {
$.when(angular.bootstrap($('.post'), ['posts'])).done( function() {
console.log('POSTS: bootstrapped');
//Manually add the controller to the comments element. (May or may not be
//necessary, but we were doing something that required it to work.)
$('.comments').attr('ng-controller', 'CommentsCtrl');
$.when(angular.bootstrap($('.comments'), ['comments'])).done( function() {
console.log('COMMENTS: bootstrapped');
});
});
});
答案 3 :(得分:1)
我希望您可以使用“ui-router”路由模块。
以下是此http://www.ng-newsletter.com/posts/angular-ui-router.html
的精彩教程