Javascript 在两个阵列之间移动对象
我有两个由包含对象的数组组成的列表。 我试图将对象从一个列表移动到另一个列表,反之亦然 控制器:Javascript 在两个阵列之间移动对象,javascript,arrays,angularjs,object,ng-options,Javascript,Arrays,Angularjs,Object,Ng Options,我有两个由包含对象的数组组成的列表。 我试图将对象从一个列表移动到另一个列表,反之亦然 控制器: spApp.controller('userCtrl', function userCtrl($scope,userService,groupService){ //Generate list of all users on the SiteCollection $scope.users = userService.getUsers();
spApp.controller('userCtrl',
function userCtrl($scope,userService,groupService){
//Generate list of all users on the SiteCollection
$scope.users = userService.getUsers();
//array of objects selected through the dom
$scope.selectedAvailableGroups;
$scope.selectedAssignedGroups;
//array of objects the user actually belongs to
$scope.availableGroups;
$scope.assignedGroups;
//Generate all groups on the site
$scope.groups = groupService.getGroups();
//Boolean used to disable add/remove buttons
$scope.selectedUser = false;
//Take the selectedAvailableGroups, add user to those groups
//so push objects to "assignedGroups" array and remove from "avaiableGroups" array
$scope.addUserToGroup = function (){
userService.addUserToGroup($scope.selectedUser, $scope.selectedAvailableGroups, $scope.assignedGroups, $scope.availableGroups)
};
}
);
服务:
spApp.factory('userService', function(){
var addUserToGroup = function (selectedUser, selectedAvailableGroups, assignedGroups, availableGroups) {
var addPromise = [];
var selectLength = selectedAvailableGroups.length;
//Add user to selected groups on server
for (var i = 0; i < selectLength; i++) {
addPromise[i] = $().SPServices({
operation: "AddUserToGroup",
groupName: selectedAvailableGroups[i].name,
userLoginName: selectedUser.domain
});
};
//when all users added, update dom
$.when.apply($,addPromise).done(function (){
for (var i = 0; i < selectLength; i++) {
assignedGroups.push(selectedAvailableGroups[i]);
availableGroups.pop(selectedAvailableGroups[i]);
};
//alert(selectedUser.name + " added to: " + JSON.stringify(selectedAvailableGroups));
});
}
}
HTML:
可用组
添加用户
去除
指定组
现在,推送到指定的组工作,但只有当我点击其他东西或在列表中,而不是真正的动态更新。但是最大的问题是.pop()
,我认为它没有达到预期的效果 $.when.apply($,addPromise).done()
似乎不是角度api或同步的。所以angular没有意识到你的变化。您必须将代码包装在$scope.$apply
调用中:
$scope.$apply(function(){
for (var i = 0; i < selectLength; i++) {
assignedGroups.push(selectedAvailableGroups[i]);
availableGroups.pop(selectedAvailableGroups[i]);
};
});
$scope.$apply(函数(){
对于(变量i=0;i
如果单击某个对象,将出现$digest循环,您将看到所做的更改
您的
pop
无法工作,因为Array.pop
仅删除最后一个元素。我想那不是你想要的。如果你想删除一个特定的元素,你应该使用Array.splice()
,哦,哇,我刚刚读了关于apply()和digest()的文章,但从来没有想到它会应用到你上面提到的代码中。是的,你说得对,爸爸不是我想做的。我需要从组数组中删除SelectedGroup。比如,如果我有一个数组列表1,2,3,并选择(这是它自己的数组)1,3,我需要删除那些剩下的2。不过,我将应用您建议的解决方案,一次解决一个问题。ThanksI在“我的服务”中使用$scope时出现未定义$scope错误。@蝙蝠侠$scope在您的服务中不可用。您可以为addUserToGroup函数提供一个附加参数。如果这样做有效的话,我建议你用promiss($q servcie)重新构造你的代码,这会减少依赖性,并为你调用$apply。美元。当基本上是处理承诺时,他们完成了。我真的不确定如何将此转换为有角度的承诺我尝试采纳您的建议,使用有角度的承诺,不确定是否正确:
<div>
<label for="entityAvailable">Available Groups</label>
<select id="entityAvailable" multiple
ng-model="selectedAvailableGroups"
ng-options="g.name for g in availableGroups | orderBy:'name'">
</select>
</div>
<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>
<div>
<label for="entityAssigned">Assigned Groups</label>
<select id="entityAssigned" multiple
ng-model="selectedAssignedGroups"
ng-options="g.name for g in assignedGroups | orderBy:'name'">
</select>
</div>
$scope.$apply(function(){
for (var i = 0; i < selectLength; i++) {
assignedGroups.push(selectedAvailableGroups[i]);
availableGroups.pop(selectedAvailableGroups[i]);
};
});