我什么时候应该在我的应用程序中使用多个控制器?
when should i use more than one controller in my app?
所以最近我开始学习 angularJS 我正在做一个 SPA 项目。
这是一个有几个步骤的游戏(游戏的目的对于问题的重要性并不重要)
目前我的每个步骤都有一个控制器,它们都是 mainControlelr 的子级,所以在我的 html 中它看起来像:
<div class="container" ng-controller="mainCtrl">
<!--main container-->
<div class="row">
<!--center pane-->
<div id="centerPane" class="col-lg-8 center-block">
.
. some code...
.
<!--steps-->
<div ng-view id="form-views"></div>
.
. some code...
.
</div>
.
. some code...
.
</div>
在与我的一些朋友交谈后,他们都告诉我这不是一个好方法,我应该改为执行以下操作之一:
- 只使用一个控制器(对于这个例子,'mainCtrl')
- 保持这样的代码,但向我所有的控制器注入一个特定的服务,它将保存我所有的全局变量并确保控制器正在更新服务变量。
所以基本上我的问题是,根据经验,什么时候应该考虑在 SPA 中使用多个控制器?
谢谢,
不,我建议反对将所有代码放在一个控制器中。这使得它很难理解,因为很多业务逻辑都在一个文件中,而且很难进行单元测试。
首先,业务逻辑应该放在一个服务中。将尽可能多的业务逻辑放在控制器之外,并将其放在服务或工厂中。
假设您正在使用 ngRoute(我在您的代码中看到 ng-view
)并且步骤是一个接一个的,我建议充分利用 ngRoute 组件。这意味着应用程序中的每个步骤都应该有自己的路由和公司控制器。如前所述,应用于多个路由的业务逻辑应抽象为服务或工厂。
为了更清楚,下面的代码可以是每一步的路由配置。
.config(['$routeProvider',
function($routeProvider) {
$routeProvider.
when('/step-1', {
templateUrl: 'partials/step1.html',
controller: 'StepOneCtrl'
}).
when('/step-2', {
templateUrl: 'partials/step2.html',
controller: 'StepTwoCtrl'
}).
otherwise({
redirectTo: '/step-1'
});
}]);
所以最近我开始学习 angularJS 我正在做一个 SPA 项目。 这是一个有几个步骤的游戏(游戏的目的对于问题的重要性并不重要)
目前我的每个步骤都有一个控制器,它们都是 mainControlelr 的子级,所以在我的 html 中它看起来像:
<div class="container" ng-controller="mainCtrl">
<!--main container-->
<div class="row">
<!--center pane-->
<div id="centerPane" class="col-lg-8 center-block">
.
. some code...
.
<!--steps-->
<div ng-view id="form-views"></div>
.
. some code...
.
</div>
.
. some code...
.
</div>
在与我的一些朋友交谈后,他们都告诉我这不是一个好方法,我应该改为执行以下操作之一:
- 只使用一个控制器(对于这个例子,'mainCtrl')
- 保持这样的代码,但向我所有的控制器注入一个特定的服务,它将保存我所有的全局变量并确保控制器正在更新服务变量。
所以基本上我的问题是,根据经验,什么时候应该考虑在 SPA 中使用多个控制器?
谢谢,
不,我建议反对将所有代码放在一个控制器中。这使得它很难理解,因为很多业务逻辑都在一个文件中,而且很难进行单元测试。
首先,业务逻辑应该放在一个服务中。将尽可能多的业务逻辑放在控制器之外,并将其放在服务或工厂中。
假设您正在使用 ngRoute(我在您的代码中看到 ng-view
)并且步骤是一个接一个的,我建议充分利用 ngRoute 组件。这意味着应用程序中的每个步骤都应该有自己的路由和公司控制器。如前所述,应用于多个路由的业务逻辑应抽象为服务或工厂。
为了更清楚,下面的代码可以是每一步的路由配置。
.config(['$routeProvider',
function($routeProvider) {
$routeProvider.
when('/step-1', {
templateUrl: 'partials/step1.html',
controller: 'StepOneCtrl'
}).
when('/step-2', {
templateUrl: 'partials/step2.html',
controller: 'StepTwoCtrl'
}).
otherwise({
redirectTo: '/step-1'
});
}]);