我有两个基本相同的功能。喜欢线路真的。一个用于添加用户,另一个用于删除用户。我想知道是否有更好的方法可以做到这一点?或者我应该把它分开。
添加用户控制器功能:
$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变量组合到一个对象中并简单地将对象传递给函数,这样会更容易吗?
答案 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();
}