我开始使用 AngularJS 开发我的第一个大项目,当我在考虑应用程序的设计时,我发现了一些我不理解的东西。
我在考虑单页应用程序,所以我使用 ng-view 和 routeProvider 将每个查询路由到正确的模板和控制器。但是,我的一些模板有点复杂,我首先想到的是使用不同的控制器来管理每个模板。也就是说,同一模板的不同部分将由不同的控制器管理。问题(或者至少,我认为是问题)是 routeProvider 只允许将一个模板关联到一个控制器。这让我觉得除了我在使用 routeProvider 的路由配置中指定的控制器之外,我不能将另一个控制器用于模板。
然后我开始想办法重组未来的项目,这样我就可以在同一个模板中维护由单个控制器管理的每个不同的功能,并且仍然让它们之间的控制器交互。
经过一番头疼后,我决定尝试实施我的第一种方法,看看它是如何失败的......真是太惊喜了!它工作得很好!但是,我不知道确切的原因。
让我给你看这个简单的例子:
脚本.js
angular.module('myApp', [
'ngRoute'
])
.config(function ($routeProvider, $locationProvider) {
$routeProvider
.when('/', {
templateUrl: 'main',
controller: 'MainCtrl'
});
$locationProvider.html5Mode(true);
});
angular.module('myApp')
.controller('MainCtrl', function ($scope) {
// whatever...
});
});
angular.module('myApp')
.controller('FirstCtrl', function ($scope) {
$scope.first = function(){
alert("First");
};
});
});
angular.module('myApp')
.controller('SecondCtrl', function ($scope) {
$scope.second= function(){
alert("Second");
};
});
});
main.html
<div ng-controller="FirstCtrl">
<button ng-click="first()">First!</button>
</div>
<div ng-controller="SecondCtrl">
<button ng-click="second()">Second!</button>
</div>
索引.html
<body ng-app="myApp">
<div ng-view=""></div>
</body>
我想如果您将路由配置为将“main”模板关联到“MainCtrl”控制器,那将是唯一与模板交互的控制器,但事实并非如此。
我首先认为找不到“first”和“second”函数,因为在路由配置中没有声明“FirstCtrl”和“SecondCtrl”。我想也许 routeProvider 会“包装”(或类似的东西)“主”模板和“MainCtrl”控制器,而“主”模板将无法访问其余的控制器。
但这不正确,来自不同控制器的“第一”和“第二”功能正常工作。那么,在路由配置中为模板指定控制器有什么意义呢?您可以只设置一个模板来呈现指定的查询,并且该模板可以使用模块的任何控制器。
也许这不是一个好的设计,我不知道。
你能帮我更好地理解这一点吗?
谢谢!