AngularJS - 将重复功能从控制器移至服务
AngularJS - move repeating functions from controller to service
嗨,我是 angular JS 的新手,我正在尝试重构我的控制器,并希望将重复的 multisort 函数作为服务移动并在控制器中调用它。
谁能帮我把下面这个函数转换为服务,因为它具有所有 $scope,而且我知道它不能在服务或工厂中使用:
$scope.multiSort = function(columnName){
if($scope.orderByField.includes(columnName)){
if(reverseSortObj[columnName].count == 2){
var index = $scope.orderByField.indexOf(columnName)
$scope.orderByField.splice(index, 1);
delete reverseSortObj.columnName;
return;
}
var indexToReplace = $scope.orderByField.indexOf(columnName);
$scope.orderByField[indexToReplace] = '-'+ columnName;
reverseSortObj[columnName].reverse = !reverseSortObj[columnName].reverse;
reverseSortObj[columnName].count ++;
}
else if($scope.orderByField.includes('-'+ columnName)){
if(reverseSortObj[columnName].count == 2){
var index = $scope.orderByField.indexOf('-' + columnName)
$scope.orderByField.splice(index, 1);
delete reverseSortObj.columnName;
return;
}
var indexToReplace = $scope.orderByField.indexOf('-' + columnName);
$scope.orderByField[indexToReplace] = columnName;
reverseSortObj[columnName].reverse = !reverseSortObj[columnName].reverse;
reverseSortObj[columnName].count ++;
}
else{
reverseSortObj[columnName] = {};
reverseSortObj[columnName].reverse = false;
reverseSortObj[columnName].count = 1;
$scope.orderByField.push(columnName);
}
}
如果不想改代码,可以直接将$scope传给服务,获取as scope
下面是一个工作示例,已根据您的要求进行了简化。
(function(){
var app = angular.module('App', []);
app.controller('AppController', ['$scope', 'AppService', function($scope, AppService){
$scope.text = 'Hello World';
$scope.columns = ['a', 'c', 'b'];
$scope.sorted = AppService.sort($scope);
console.log($scope.sorted);
}]);
app.service('AppService', [function(){
var service = {};
service.sort = function(scope){
return scope.columns.sort();
}
return service;
}]);
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<div ng-app="App">
<div ng-controller="AppController">{{text}}</div>
</div>
创建服务并发送您的参数。以下代码未经测试,但您应该明白了。发送您需要的对象并完成工作。修改两个变量后,我建议 returning 一个对象,将 orderByField 和 reverseSortObj 作为其属性,因为您不一定要依赖按引用传递。在 return 之后,您想将修改后的值设置为您的作用域或局部变量。
'use strict';
angular.module("myApp").factory('sortService', {
function multiSort(orderByField, reverseSortObj, columnName) {
if(orderByField.includes(columnName)){
if(reverseSortObj[columnName].count == 2){
var index = orderByField.indexOf(columnName)
orderByField.splice(index, 1);
delete reverseSortObj.columnName;
} else {
var indexToReplace = orderByField.indexOf(columnName);
orderByField[indexToReplace] = '-'+ columnName;
reverseSortObj[columnName].reverse = !reverseSortObj[columnName].reverse;
reverseSortObj[columnName].count ++;
}
}
else if(orderByField.includes('-'+ columnName)){
if(reverseSortObj[columnName].count == 2){
var index = orderByField.indexOf('-' + columnName)
orderByField.splice(index, 1);
delete reverseSortObj.columnName;
} else {
var indexToReplace = orderByField.indexOf('-' + columnName);
orderByField[indexToReplace] = columnName;
reverseSortObj[columnName].reverse = !reverseSortObj[columnName].reverse;
reverseSortObj[columnName].count ++;
}
} else {
reverseSortObj[columnName] = {};
reverseSortObj[columnName].reverse = false;
reverseSortObj[columnName].count = 1;
orderByField.push(columnName);
}
return { orderByField: orderByField, reverseSortObj: reverseSortObj };
}
return {
multiSort: multiSort
};
});
// in controller or directive
var result = sortService.multSort($scope.orderByField, reverseSortObj, columnName);
$scope.orderByField = result.orderByField;
reverseSortObj = result.reverseSortObj;
嗨,我是 angular JS 的新手,我正在尝试重构我的控制器,并希望将重复的 multisort 函数作为服务移动并在控制器中调用它。
谁能帮我把下面这个函数转换为服务,因为它具有所有 $scope,而且我知道它不能在服务或工厂中使用:
$scope.multiSort = function(columnName){
if($scope.orderByField.includes(columnName)){
if(reverseSortObj[columnName].count == 2){
var index = $scope.orderByField.indexOf(columnName)
$scope.orderByField.splice(index, 1);
delete reverseSortObj.columnName;
return;
}
var indexToReplace = $scope.orderByField.indexOf(columnName);
$scope.orderByField[indexToReplace] = '-'+ columnName;
reverseSortObj[columnName].reverse = !reverseSortObj[columnName].reverse;
reverseSortObj[columnName].count ++;
}
else if($scope.orderByField.includes('-'+ columnName)){
if(reverseSortObj[columnName].count == 2){
var index = $scope.orderByField.indexOf('-' + columnName)
$scope.orderByField.splice(index, 1);
delete reverseSortObj.columnName;
return;
}
var indexToReplace = $scope.orderByField.indexOf('-' + columnName);
$scope.orderByField[indexToReplace] = columnName;
reverseSortObj[columnName].reverse = !reverseSortObj[columnName].reverse;
reverseSortObj[columnName].count ++;
}
else{
reverseSortObj[columnName] = {};
reverseSortObj[columnName].reverse = false;
reverseSortObj[columnName].count = 1;
$scope.orderByField.push(columnName);
}
}
如果不想改代码,可以直接将$scope传给服务,获取as scope
下面是一个工作示例,已根据您的要求进行了简化。
(function(){
var app = angular.module('App', []);
app.controller('AppController', ['$scope', 'AppService', function($scope, AppService){
$scope.text = 'Hello World';
$scope.columns = ['a', 'c', 'b'];
$scope.sorted = AppService.sort($scope);
console.log($scope.sorted);
}]);
app.service('AppService', [function(){
var service = {};
service.sort = function(scope){
return scope.columns.sort();
}
return service;
}]);
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<div ng-app="App">
<div ng-controller="AppController">{{text}}</div>
</div>
创建服务并发送您的参数。以下代码未经测试,但您应该明白了。发送您需要的对象并完成工作。修改两个变量后,我建议 returning 一个对象,将 orderByField 和 reverseSortObj 作为其属性,因为您不一定要依赖按引用传递。在 return 之后,您想将修改后的值设置为您的作用域或局部变量。
'use strict';
angular.module("myApp").factory('sortService', {
function multiSort(orderByField, reverseSortObj, columnName) {
if(orderByField.includes(columnName)){
if(reverseSortObj[columnName].count == 2){
var index = orderByField.indexOf(columnName)
orderByField.splice(index, 1);
delete reverseSortObj.columnName;
} else {
var indexToReplace = orderByField.indexOf(columnName);
orderByField[indexToReplace] = '-'+ columnName;
reverseSortObj[columnName].reverse = !reverseSortObj[columnName].reverse;
reverseSortObj[columnName].count ++;
}
}
else if(orderByField.includes('-'+ columnName)){
if(reverseSortObj[columnName].count == 2){
var index = orderByField.indexOf('-' + columnName)
orderByField.splice(index, 1);
delete reverseSortObj.columnName;
} else {
var indexToReplace = orderByField.indexOf('-' + columnName);
orderByField[indexToReplace] = columnName;
reverseSortObj[columnName].reverse = !reverseSortObj[columnName].reverse;
reverseSortObj[columnName].count ++;
}
} else {
reverseSortObj[columnName] = {};
reverseSortObj[columnName].reverse = false;
reverseSortObj[columnName].count = 1;
orderByField.push(columnName);
}
return { orderByField: orderByField, reverseSortObj: reverseSortObj };
}
return {
multiSort: multiSort
};
});
// in controller or directive
var result = sortService.multSort($scope.orderByField, reverseSortObj, columnName);
$scope.orderByField = result.orderByField;
reverseSortObj = result.reverseSortObj;