ng-change запускается второй раз, когда выбранная опция удаляется из ng-options - AngularJS 1.7 - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть список предметов продажи, и для каждого предмета продажи есть выпадающий список, в котором вы можете выбрать из списка доступных идентификаторов для назначения предмету продажи.Выбор должен быть уникальным для каждого предмета продажи.Если 2 выбрано из выпадающего списка saleItem1, 2 не может быть доступно в выпадающем списке для saleItem2.

После выбора идентификатора из раскрывающегося списка мне нужно удалить его из списка и заменить его старым идентификатором.При выборе идентификатора запускается ng-изменение, которое корректно обновляет список.Однако строка, помеченная звездочкой, которая удаляет выбранный идентификатор из списка, приводит к повторному запуску ng-change с нулевым значением в качестве нового идентификатора.

Я изо всех сил пытаюсь найти решение, чтобы обойтиthis.

Тот же код отлично работает в AngularJS 1.2, но после перехода на 1.7 я вижу эту проблему.

$scope.updateSaleItemIds = function(saleItem, newid) {
    var ind = $scope.availableSaleItemIds.indexOf(newid);
    if (!isNaN(saleItem.id)) {
        *$scope.availableSaleItemIds[ind] = saleItem.id;*
    }
    else {
        $scope.availableSaleItemIds.splice(ind,1);
    }
    $scope.availableSaleItemIds.sort(function(a, b){return a - b});
    var indE = $scope.saleItems.indexOf(saleItem);
    $scope.saleItems[indE].id = newid;
};

HTML

<tr ng-repeat="saleItem in saleItems" class="createForm">
    <select ng-model="selectedId"
        ng-options="id for id in availableSaleItemIds"
        ng-change="updateSaleItemIds(saleItem, selectedId)">
        <option value="">{{saleItem.id}}</option>
    </select>
</tr>

1 Ответ

0 голосов
/ 29 декабря 2018

AngularJS V1.4 включал основной рефакторинг директивы ng-options.Параметр по умолчанию теперь выбран со значением модели null.Для получения дополнительной информации см. AngularJS Developer Guide - Миграция до V1.4 - ngOptions .

Когда пользователь выбирает параметр, для модели устанавливается это новое значение, а ng-change обновляетсядоступные варианты.Функция updateSaleItemsIds удаляет это значение из списка availableSaleItemIds.Когда новый список опций не включает значение модели, директива ng-options устанавливает модель обратно в null и снова вызывает директиву ng-change.

Обходной путь - не обновлять списокпараметров, когда выбранное значение изменяется на null.

<select ng-model="selectedId"
    ng-options="id for id in availableSaleItemIds"
    ̶n̶g̶-̶c̶h̶a̶n̶g̶e̶=̶"̶u̶p̶d̶a̶t̶e̶S̶a̶l̶e̶I̶t̶e̶m̶I̶d̶s̶(̶s̶a̶l̶e̶I̶t̶e̶m̶,̶ ̶s̶e̶l̶e̶c̶t̶e̶d̶I̶d̶)̶"̶
    ng-change="selectedId && updateSaleItemIds(saleItem, selectedId)">
    <option value="">{{saleItem.id}}</option>
</select>
...