2014-01-21 6 views
-1

У меня есть две функции, которые по существу идентичны. Как для линии действительно. Один используется для добавления пользователей, другой используется для их удаления. Мне интересно, есть ли лучший способ сделать это? Или я должен просто держать его отдельно.Объединение двух функций

Добавить Функции контроллера пользователя:

$scope.addUserToGroup = function(){ 
    userService.addUserToGroup($scope.selectedUser, $scope.selectedAvailableGroups, $scope.assignedGroups, $scope.availableGroups,$scope.groups); 
}; 

Добавить Абонентское обслуживание Функция:

var addUserToGroup = function (selectedUser, selectedAvailableGroups, assignedGroups, availableGroups){ 
    var deferred = $q.defer(); 

    var addPromise = []; 
    var selectLength = selectedAvailableGroups.length; 

    //Add user to selected groups on server 
    deferred.promise 
     .then(function(){ 
     for (var i = 0; i < selectLength; i++){ 
      addPromise[i] = $().SPServices({ 
      operation: "AddUserToGroup", 
      groupName: selectedAvailableGroups[i].name, 
      userLoginName: selectedUser.domain 
      });  
     }; 
     }) 
     .then(function(){ 
      //when promise finished, push changes to availableGroups 
      for (var i = 0; i < selectLength; i++){ 
      assignedGroups.push(selectedAvailableGroups[i]); 
      //compare groups 
      }; 
     }) 
     .then(function(){ 
      alert(selectedUser.name + " added to: " + JSON.stringify(selectedAvailableGroups));    
     }) 
    //Run 
    deferred.resolve(); 
    } 

Удалить Функция пользователя контроллера:

$scope.removeUserFromGroup = function(){ 
     userService.removeUserFromGroup($scope.selectedUser,$scope.selectedAssignedGroups, $scope.availableGroups, $scope.assignedGroups) 
    }; 

Remove Service User Function:

var removeUserFromGroup = function (selectedUser,selectedAssignedGroups, availableGroups, assignedGroups){ 
    var deferred = $q.defer(); 

    var removePromise = []; 
    var selectLength = selectedAssignedGroups.length; 

    //Remove user from selected groups on server 
    deferred.promise 
     .then(function(){ 
     for (var i = 0; i < selectLength; i++){ 
      removePromise[i] = $().SPServices({ 
      operation: "RemoveUserFromGroup", 
      groupName: selectedAssignedGroups[i].name, 
      userLoginName: selectedUser.domain 
      });  
     };  
     }) 
     .then(function(){ 
     //when promise finished, push changes to availableGroups 
     for (var i = 0; i < selectLength; i++){ 
      availableGroups.push(selectedAssignedGroups[i]); 
      //compare groups 
     }; 
     }) 
     .then(function(){ 
     alert(selectedUser.name + " removed from: " + JSON.stringify(selectedAssignedGroups)); 
     }) 
    //Run 
    deferred.resolve(); 
    } 

HTML:

<div id="moveButtons" > 
    <button type="button" ng-disabled="!selectedUser" ng-click="addUserToGroup()">Add User</button> 
    <button type="button" ng-disabled="!selectedUser" ng-click="removeUserFromGroup()">Remove</button> 
</div> 

Также на стороне записки: Я передаю как 4 аргументы в эти функции каждого. Это похоже на многое. Это лучший способ сделать это? Я чувствую, что это могло бы облегчить работу, если бы я объединил все переменные переменной $ scope в объект и просто передал объект в функцию, это имело бы смысл?

+3

Pass 'operation' и предупредительного текст в качестве параметра? –

+1

Я не думаю, что один будет работать. Поскольку, например, массивы, которые я использую в каждой функции, различаются между доступными и назначенными группами. – Batman

ответ

1

Как насчет чего-то подобного? Параметр добавления - это bool.

var handleUser = function (add, selectedUser, selectedGroups, groups){ 
    var deferred = $q.defer(); 

    var removePromise = []; 
    var selectLength = selectedAssignedGroups.length; 
    var operation = add ? "AddUserToGroup" : "RemoveUserFromGroup"; 

    //Remove user from selected groups on server 
    deferred.promise 
    .then(function(){ 
     for (var i = 0; i < selectLength; i++){ 
     removePromise[i] = $().SPServices({ 
      operation: operation, 
      groupName: selectedGroups[i].name, 
      userLoginName: selectedUser.domain 
     });  
     };  
    }) 
    .then(function(){ 
     //when promise finished, push changes to availableGroups 
     for (var i = 0; i < selectLength; i++){ 
     groups.push(selectedGroups[i]); 
     //compare groups 
     }; 
    }) 
    .then(function(){ 
     var text = add ? "added to: " : "removed from: "; 
     alert(selectedUser.name + text + JSON.stringify(selectedGroups)); 
    }) 
    //Run 
    deferred.resolve(); 
} 
+0

Я не понимаю этот раздел «var operation = add?» вы проверяете, существует ли аргумент или нет строки === для «добавления»? Если бы я попытался вызвать функцию как таковую: groupService.handleUser (remove, $ scope.selectedUser, $ scope.selectedAssignedGroups) Я не уверен, что я получу. – Batman

+0

@Batman, add - это логическое значение, относящееся к тому, добавляете ли вы (true) или удаляете (false). Он говорит, что если добавление верно, ваша операция - addUserToGroup. –

+0

Oooooh, хорошо, поэтому, когда я вызываю функцию, я бы хотел что-то вроде handleUser (true, selectedUser, selectedGroups)? – Batman

1

Чтобы сделать код более DRY (http://en.wikipedia.org/wiki/Don%27t_repeat_yourself) Я хотел бы предложить прохождение операции в качестве параметра. Я хотел бы также передать все параметры в качестве объекта, чтобы избежать путаницы, чтобы помнить в каком порядке параметры должны быть в надежде, что это помогает:.

var performOperationOnUserInGroup = function (options) { 
    var operation = options.operation; 
    var selectedUser = options.selectedUser; 
    var selectedAssignedGroups = options.selectedAssignedGroups; 
    var availableGroups = options.availableGroups; 
    var assignedGroups = options.assignedGroups; 

    var deferred = $q.defer(); 

    var addPromise = []; 
    var selectLength = selectedAvailableGroups.length; 

    //Add user to selected groups on server 
    deferred.promise 
    .then(function(){ 
     for (var i = 0; i < selectLength; i++){ 
     addPromise[i] = $().SPServices({ 
      operation: operation, 
      groupName: selectedAvailableGroups[i].name, 
      userLoginName: selectedUser.domain 
     });  
     }; 
    }) 
    .then(function(){ 
     //when promise finished, push changes to availableGroups 
     for (var i = 0; i < selectLength; i++){ 
      assignedGroups.push(selectedAvailableGroups[i]); 
      //compare groups 
     }; 
    }) 
    .then(function(){ 
     var action = operation === "AddUserToGroup" ? " added to: " : 
        operation === "RemoveUserFromGroup" ? "removed from: " : 
        " modified in: "; // Or throw error. 
     alert(selectedUser.name + action + JSON.stringify(selectedAvailableGroups));   
    }) 
    //Run 
    deferred.resolve(); 
} 
+0

И я думаю, что параметры будут объектом моего контроллера со всеми объектами, которые должны быть настроены в службе? – Batman

+0

На самом деле вы можете просто передать $ scope непосредственно для выполненияOperationOnGroup, так как он имеет все необходимые свойства. –

Смежные вопросы