结合控制器AngularJS中的常用功能

时间:2015-04-18 18:30:43

标签: javascript angularjs angularjs-scope angularjs-controller code-reuse

我正在使用该项目。我正在使用分页,checkAll,deleteAll类似所有控制器之间通用的功能。我希望将代码移到工厂或服务中,以便可以用于所有控制器。我试过但不完美清楚。我想暗示一下。 我知道创建工厂或服务,以及如何对控制器进行操作,但有点混淆移动类似代码的逻辑。

我举例说明我用来编写所有控制器,逻辑分类和分页。

$scope.bigCurrentPage = 1;
$scope.editIndex = "";

var sortKey = "name";
var sortDirection = "ASC";
$scope.filterObj = {order: [sortKey + " " + sortDirection], limit: CONFIG.limit, offset: 0};
$scope.filterObj.offset = ($scope.bigCurrentPage - 1) * CONFIG.limit;

$scope.sortList = function (inputSort) {
    if (sortKey === inputSort) {
        sortDirection = (sortDirection === "ASC") ? "DESC" : "ASC";
    } else {
        sortKey = inputSort;
    }
    $scope.filterObj.order = [sortKey + " " + sortDirection];
    $scope.pageChanged();
}


$scope.getSongs = function () {
    $scope.filterObj.offset = ($scope.bigCurrentPage - 1) * CONFIG.limit;
    Song.find({filter: $scope.filterObj})
            .$promise
            .then(function (data) {
                $scope.items = data;
                $scope.maxSize = 5;
                $scope.size = $scope.filterObj.limit;
                $scope.countingIndex = ($scope.bigCurrentPage - 1) * $scope.filterObj.limit; //Its idea to implement counting. Variable is not part of pagination..////     
            });
};


$scope.pageChanged = function () {
    $scope.getSongs();
};

$scope.pageChanged();

这样,假设我正在为Albums执行此操作,并且我将sortKey更改为'id',将使用'Album.find'的服务,将更改'filter'对象并且我已完成,但事实是我正在使用所有控制器中的公共代码。我怎样才能更好地写出来。

1 个答案:

答案 0 :(得分:4)

你确实有很多很难在服务中维护的属性,所以我建议你应该使用控制器而不是服务,(或者在服务中放置可重用的变量,使代码更有意义)。下面创建的控制器可以使用$controller依赖项在任何其他控制器中注入。

通用控制器

app.controller('commonCtrl', function($scope) {
    $scope.bigCurrentPage = 1;
    $scope.editIndex = "";

    var sortKey = "name";
    var sortDirection = "ASC";
    $scope.filterObj = {
        order: [sortKey + " " + sortDirection],
        limit: CONFIG.limit,
        offset: 0
    };
    $scope.filterObj.offset = ($scope.bigCurrentPage - 1) * CONFIG.limit;

    $scope.sortList = function(inputSort) {
        if (sortKey === inputSort) {
            sortDirection = (sortDirection === "ASC") ? "DESC" : "ASC";
        } else {
            sortKey = inputSort;
        }
        $scope.filterObj.order = [sortKey + " " + sortDirection];
        $scope.pageChanged();
    }

    $scope.getSongs = function() {
        $scope.filterObj.offset = ($scope.bigCurrentPage - 1) * CONFIG.limit;
        Song.find({
                filter: $scope.filterObj
            })
            .$promise
            .then(function(data) {
                $scope.items = data;
                $scope.maxSize = 5;
                $scope.size = $scope.filterObj.limit;
                $scope.countingIndex = ($scope.bigCurrentPage - 1) * $scope.filterObj.limit; //Its idea to implement counting. Variable is not part of pagination..////     
            });
    };

    $scope.pageChanged = function() {
        $scope.getSongs();
    };

    $scope.pageChanged();
});

您可以使用$ controller dependency将此创建的commonCtrl注入任何其他控制器,commonCtrl将其范围分配给注入它的控制器。但controllerA中的commonCtrl所做的更改在controllerB中不可用,因为commonCtrl将其范围的副本提供给注入它的控制器。

控制器A

app.controller('controllerA', function($scope, $controller){
   $controller('commonCtrl', {$scope: $scope}); //inject commonCtrl scope to current scope
   //common scope will be available from here
}) 

注意

  

如果您希望更改反映在您可以使用的其他控制器中   使用此控制器的服务将共享公共属性   不同的控制者。