Я пытаюсь переместить элементы между двумя списками выбора, используя приведенный ниже код, но элементы не перемещаются из списка доступных клиентов в списки выбранных клиентов, поэтому может ли кто-нибудь проверить приведенный ниже код и сообщить мне, что мне здесь не хватает? Спасибо

  <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 = [];                                


  });  
7
MChan 3 Июл 2014 в 19:43

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>
15
JB Nizet 3 Июл 2014 в 20:56
Спасибо за вашу помощь, предоставленный вами пример отлично работает, но только когда я сначала передаю набор результатов, возвращенный из $scope.clientsList, в $scope.availableclients. Если я попытаюсь загрузить из $scope.clientsList, как я изначально делал в своем вопросе, он не загрузит никаких данных в список доступных клиентов ..... так что я что-то упускаю/делаю здесь что-то не так? заранее спасибо
 – 
MChan
4 Июл 2014 в 18:55
1
Это одна из проблем: последовательно используйте доступные клиенты или список клиентов, но не то и другое одновременно.
 – 
JB Nizet
4 Июл 2014 в 20:30
Очень хорошо. Но у меня есть еще одна проблема. Когда я переношу эту логику в директиву (чтобы я мог ее повторно использовать), у меня происходит следующее: * Выберите элемент из списка availableClients, который НЕ является нижним элементом * Нажмите «Добавить клиент» (это работает) * Попробуйте выбрать другой элемент из avaliableClients Поле со списком "Заблокировано??!". Он имеет фокус, но никакие элементы не могут быть выбраны. ПРИМЕЧАНИЕ: если я выберу нижний элемент и передвину его, я могу выбрать другой. Кто-нибудь знает об этом?
 – 
GregJF
10 Июн 2016 в 02:37
Задайте свой вопрос с помощью кода, plunkr и т. д.
 – 
JB Nizet
10 Июн 2016 в 08:36
1
Вместо доступных[0] и выбранных[0] используйте доступные и выбранные и переместите все элементы доступных или выбранных в целевой массив.
 – 
JB Nizet
23 Июн 2016 в 09:21

По поводу моего комментария / вопроса. Я действительно нашел ответ. Итак, для тех, кто пришел сюда и столкнулся с такой же проблемой, вот что я нашел.

При перемещении элемента из одного списка 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' в конструкторе директивы. Надеюсь это поможет

0
GregJF 14 Июн 2016 в 01:37