Я пытаюсь переместить элементы между двумя списками выбора, используя приведенный ниже код, но элементы не перемещаются из списка доступных клиентов в списки выбранных клиентов, поэтому может ли кто-нибудь проверить приведенный ниже код и сообщить мне, что мне здесь не хватает? Спасибо
<div ng-app>
<div ng-controller="testCtrl">
<label for="aclients">Available Clients</label>
<select size="5" multiple ng-model="available" ng-options="client.id as client.Name for client in clientsList" style="width: 400px"></select>
<input id="moveright" type="button" value="Add Client" ng-click="moveItem(available[0], availableclients,selectedclients)" />
<input id="moverightall" type="button" value="Add All Clients" ng-click="moveAll(availableclients,selectedclients)" />
<input id="move left" type="button" value="Remove Client" ng-click="moveItem(selected[0], selectedclients,availableclients)" />
<input id="moveleftall" type="button" value="Remove All Clients" ng-click="moveAll(availableclients,selectedclients)" />
<label for="sclients">Selected Clients</label>
<select size="5" multiple ng-model="selected" ng-options="client.id as client.Name for client in selectedclients" style="width: 400px"></select>
<div>Selected Clients IDs: {{selectedclients}}</div>
</div>
</div>
Контроллер:
app.controller('testCtrl',
function testCtrl($scope, clientsService){
$scope.clientsList = clientsService.getClientsList().then(
function(response){
$scope.clientsList = response;
},
function(status){
console.log(status);
}
);
$scope.moveItem = function(item, from, to) {
console.log('Move item Item: '+item+' From:: '+from+' To:: '+to);
//Here from is returned as blank and to as undefined
var idx=from.indexOf(item);
if (idx != -1) {
from.splice(idx, 1);
to.push(item);
}
};
$scope.moveAll = function(from, to) {
console.log('Move all From:: '+from+' To:: '+to);
//Here from is returned as blank and to as undefined
angular.forEach(from, function(item) {
to.push(item);
});
from.length = 0;
};
$scope.availableclients = [];
$scope.selectedclients = [];
});
2 ответа
В вашем шаблоне есть несколько небольших проблем:
- Вы перемещаете объекты из
availableclients
вselectedclients
, но при первом выборе отображаются параметры изclientsList
, а не изavailableclients
Вы перемещаете идентификаторы, а не объекты. Ваши ng-опции должны быть просто
client as client.name for client in availableclients
Ваша кнопка удалить все перемещается из доступного в выбранное вместо перемещения из выбранного в доступное.
Вот рабочий plunkr: http://plnkr.co/edit/RYEmpkBjQStoCfgpWPEK?p=preview а>
<label for="aclients">Available Clients</label>
<select size="5" multiple ng-model="available" ng-options="client as client.name for client in availableclients" style="width: 400px"></select>
<input id="moveright" type="button" value="Add Client" ng-click="moveItem(available[0], availableclients,selectedclients)" />
<input id="moverightall" type="button" value="Add All Clients" ng-click="moveAll(availableclients,selectedclients)" />
<input id="move left" type="button" value="Remove Client" ng-click="moveItem(selected[0], selectedclients,availableclients)" />
<input id="moveleftall" type="button" value="Remove All Clients" ng-click="moveAll(selectedclients,availableclients)" />
<label for="sclients">Selected Clients</label>
<select size="5" multiple ng-model="selected" ng-options="client as client.name for client in selectedclients" style="width: 400px"></select>
По поводу моего комментария / вопроса. Я действительно нашел ответ. Итак, для тех, кто пришел сюда и столкнулся с такой же проблемой, вот что я нашел.
При перемещении элемента из одного списка SELECT в другой список SELECT угловая модель в исходном списке может «потеряться». Чтобы этого избежать, изменение каждого списка должно выполняться в отдельном вызове функции $ apply. Вот сокращенный пример изнутри обработчика событий
onClickRight = function (item, from, to) {
var self = this;
var selecteditem = angular.copy(item);
self.$timeout(function () {
self.scope.$apply(function () {
for (var idx = 0; idx < from.length; idx++) {
if (from[idx].value == item.value && from[idx].displayValue == item.displayValue) {
item.length = 0;
from.splice(idx, 1);
break;
}
};
});
}, 200);
self.$timeout(function () {
self.scope.$apply(function () {
to.push(selecteditem);
});
}, 300);
};
'Item' клонируется с angular.copy, поэтому его можно использовать во втором angular $ apply. Мои параметры имеют 2 свойства: value и displayValue. Я также назначаю $ timeout и $ scope переменной 'self' в конструкторе директивы. Надеюсь это поможет
Похожие вопросы
Связанные вопросы
Новые вопросы
angularjs
Используйте для вопросов об AngularJS (1.x), JavaScript-фреймворке с открытым исходным кодом. НЕ используйте этот тег для Angular 2 или более поздних версий; вместо этого используйте тег [angular].