角度项目结构,服务和控制器

时间:2015-11-12 12:16:40

标签: javascript angularjs

今天早些时候我问过如何从另一个控制器调用一个控制器,我在哪些功能应该在哪里等很麻烦。这让我想到了更大的图景,我应该如何建立我的项目,是尽可能干净和合乎逻辑。

我的应用程序适用于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,那将很难阅读,但仍然按预期工作。

2 个答案:

答案 0 :(得分:1)

如果您的应用正在增长,请将其分解为多个控制器。在我在public / js / media文件夹中的最后一个项目中,我有media.js(控制器),media.service.js,media.tmpl.html和_media.scss。

更简单的方法是通过主视图分解它们(您可能也有嵌套视图或模板)。

就注入服务而言,我喜欢在服务中尽可能多地完成工作,并且我将实际服务限制为处理外部数据,并且工厂处理传递,解析或复制的本地/返回数据。

我按照您在服务API调用结束时附加承诺的方式构建API调用。随着代码的扩展,这将使您的控制器更加清晰。

答案 1 :(得分:1)

我喜欢让我的控制器负责一件事。

例如,我有一个项目管理应用程序。在项目页面上,左侧有搜索,右侧有所选项目。我有一个控制器,因为它们不相关,我可以改变一个而不影响另一个。

所选项目显示有三个选项卡,一个用于常规信息,一个用于任务列表,另一个用于联系人列表。我为每个标签都有一个控制器。因为它们都注入了项目服务,所以当它们实例化时,它们都可以访问相同的项目对象,这样可以使每个控制器都集中在一起。

当用户添加任务或联系人时,我会显示一个模式,其中包含可用任务或联系人列表。一个单独的控制器处理该列表和模态。

这是单一责任原则,它可以很好地保持您的代码清洁,即使它意味着拥有更多的控制器。这也意味着我的东西可以重复使用。如果我想在不同的实体上使用其中一个模态,因为模态没有项目的概念,它只知道它正在搜索任务或项目并将选定的模型返回给它的调用者。如果我有一个大控制器,我将不得不再次编写该代码。