结合两个功能

时间:2014-01-21 16:09:26

标签: javascript angularjs

我有两个基本相同的功能。喜欢线路真的。一个用于添加用户,另一个用于删除用户。我想知道是否有更好的方法可以做到这一点?或者我应该把它分开。

添加用户控制器功能:

$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)
    };

删除用户服务功能:

  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变量组合到一个对象中并简单地将对象传递给函数,这样会更容易吗?

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:1)

为了使你的代码更干(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();
}