2015-02-11 72 views
0

我想清理一個控制器,其中有太多的代碼行。在下面的控制器中,您可以找到一個名爲getProductDetails的函數,我想將篩選器移至工廠或服務,但我不確定如何執行此操作。任何幫助讚賞。移動代碼到工廠(角度)

'use strict'; 

(function() { 
var userQuoteBuild = angular.module('priceApp'); 
userQuoteBuild.controller('quoteBuilderController', function ($scope, $http) { 

// loads of controller logic here... 

    $scope.getProductDetails = function (item) { 

     $scope.listOfProductVariants = item.default_variant_attributes; 

     // TODO: put this in its own factory? 
     $scope.selectedProductAttributes = $scope.listOfAttributes.filter(function (item) { 
      var validated = false, i, length = $scope.listOfProductVariants.length; 
      for (i = 0; i < length; i++) { 
       if (item.name === $scope.listOfProductVariants[i]){ 
        validated = true; 
       } 
      } 
      return validated; 
     }); 
    }; 



}); 

回答

1
(function() { 

    'use strict'; 

    angular 
     .module('priceApp') 
     .factory('filterService', filterService); 

    function filterService() { 
     var service = { 
      getValidated: getValidated 
     } 

     return service; 

     function getValidated(list, variants) { 
      return list.filter(function (item) { 
       var validated = false, i, length = variants.length; 
       for (i = 0; i < length; i++) { 
        if (item.name === variants[i]) { 
         validated = true; 
        } 
       } 
       return validated; 
      }); 
     } 
    } 
})(); 

簡單地注入這個filterService到控制器,然後用它作爲這裏例如:

 $scope.selectedProductAttributes = filterService 
              .getValidated($scope.listOfAttributes, 
                 $scope.listOfProductVariants) 

我跟着John Papa's AngularJS Style Guide。確保選擇比filterService更好的名字。 :)

+0

非常感謝!這對我有效 – 2015-02-16 13:19:43

0

檢查:

userQuoteBuild.factory('myService', function() { 
    var service = { 
     getProductDetails: function(item) { 
      // your logic 
      return value; 
     } 
    } 
    return service; 
});