今天早些时候我问过如何从另一个控制器调用一个控制器,我在哪些功能应该在哪里等很麻烦。这让我想到了更大的图景,我应该如何建立我的项目,是尽可能干净和合乎逻辑。
我的应用程序适用于SharePoint服务器,我有带$resource
factorys的service.js文件与SharePoint通信,例如:
ItemService.js
myApp.service('ItemService', function ($q, Item) {
this.getItem = function (id){
var deferred = $q.defer();
setTimeout(function() {
var item = Item.get({ID: id }, function(){
deferred.resolve(item.d.results[0]);
}, function(error){
deferred.reject(error);
});
}, 1000);
return deferred.promise;
};
});
myApp.factory('Item', function($resource) {
return $resource("serverURL/lists/getByTitle('Items')/items", {}, {
get: {
method: 'GET',
headers: { "Accept": "application/json; odata=verbose" },
url: "serverURL/lists/getByTitle('Items')/items?$select=&$filter=ID eq :ID"
}
});
});
要使用这些服务,我有一个控制器文件,例如:
ItemController.js
angular.module('myApp').controller('ItemController', function ($scope, $modal, $log, ItemService) {
$scope.loadItem = function(id){
var promise = ItemService.getItem(id);
promise.then(function(item){
$scope.viewItem(item);
}, function(err){console.log(err);})
};
});
这是共享点列表Items
的控制器和服务文件的示例,我还有一个控制器和一个Tasks
服务,以及主控制器AppController
。
我的额外控制器是否不必要?我应该将我的服务注入我的AppController,并在那里编写我的函数吗?
我的问题是,当我的项目变得更大时,这种方式更容易阅读和理解,但代码变得更加复杂,因为控制器必须进行大量的沟通。另一方面,如果我将我的服务注入我的AppController,那将很难阅读,但仍然按预期工作。
答案 0 :(得分:1)
如果您的应用正在增长,请将其分解为多个控制器。在我在public / js / media文件夹中的最后一个项目中,我有media.js(控制器),media.service.js,media.tmpl.html和_media.scss。
更简单的方法是通过主视图分解它们(您可能也有嵌套视图或模板)。
就注入服务而言,我喜欢在服务中尽可能多地完成工作,并且我将实际服务限制为处理外部数据,并且工厂处理传递,解析或复制的本地/返回数据。
我按照您在服务API调用结束时附加承诺的方式构建API调用。随着代码的扩展,这将使您的控制器更加清晰。
答案 1 :(得分:1)
我喜欢让我的控制器负责一件事。
例如,我有一个项目管理应用程序。在项目页面上,左侧有搜索,右侧有所选项目。我有一个控制器,因为它们不相关,我可以改变一个而不影响另一个。
所选项目显示有三个选项卡,一个用于常规信息,一个用于任务列表,另一个用于联系人列表。我为每个标签都有一个控制器。因为它们都注入了项目服务,所以当它们实例化时,它们都可以访问相同的项目对象,这样可以使每个控制器都集中在一起。
当用户添加任务或联系人时,我会显示一个模式,其中包含可用任务或联系人列表。一个单独的控制器处理该列表和模态。
这是单一责任原则,它可以很好地保持您的代码清洁,即使它意味着拥有更多的控制器。这也意味着我的东西可以重复使用。如果我想在不同的实体上使用其中一个模态,因为模态没有项目的概念,它只知道它正在搜索任务或项目并将选定的模型返回给它的调用者。如果我有一个大控制器,我将不得不再次编写该代码。