2014-01-21 121 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) 
    }; 

刪除用戶服務功能:

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:

​​

另外一個側面說明:我喜歡傳遞4個參數輸入到這些功能。這似乎很多。這是做這件事的最好方法嗎?我覺得如果我將所有$ scope變量組合到一個對象中,並簡單地將該對象傳遞給該函數,會讓事情變得更容易,這會更有意義嗎?

+3

通'operation'和警報文本作爲參數? –

+1

我不認爲這樣會有效。由於例如我在每個函數中使用的陣列在可用組和已分配組之間有所不同。 – Batman

回答

1

這樣的事情呢? add參數是一個布爾值。

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)。它說如果add爲true,那麼你的操作是addUserToGroup。 –

+0

Oooooh,好吧,所以當我調用函數時,我會像handleUser(true,selectedUser,selectedGroups)? – Batman

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(); 
} 
+0

而且我猜這些選項是我的控制器中的一個對象,應該在服務中配置所有對象? – Batman

+0

實際上,您可以直接將$ scope直接傳遞給performOperationOnGroup,因爲它具有所有正確的屬性。 –