Как обновить только выбранный элемент ng-repeat вместо всех

0

У меня возникла следующая проблема: я написал приложение, в котором можно многократно добавлять div, содержащий два блока выбора. Содержимое второго блока выбора зависит от выбора первого блока выбора. Однако, как только я выбираю определенный элемент из первого окна выбора, содержимое всех существующих вторых блоков выбора обновляется. То, что я хочу, - это только текущее второе окно выбора, которое нужно обновить.

Вот мой плункер

Всякий раз, когда у меня уже есть 1..n, выберите selectItem4 из первого окна выбора текущего div, все предыдущие ячейки выбора также обновляются и содержат только две опции выбора special1 и special2, которые определены только для specialItem4. Я просто хочу, чтобы текущее второе поле выбора было обновлено:

Фрагмент кода HTML:

<div ng-switch-default="ng-switch-default">
      <select ng-model="rule.parameter" ng-options="sel1.name for sel1 in selects1" ng-change="change(rule.parameter)"></select>
      <select ng-options="sel2 for sel2 in filteredselect2" ng-model="rule.relation"></select>
</div>

Вырезанный из JS-кода:

    scope.change = function (sel2Selection) {
        scope.filteredselect2 = [];
        for(var key in scope.selects2){
            if(angular.isDefined(scope.selects2[key][sel2Selection.relation])){
                scope.filteredselect2 = scope.selects2[key][sel2Selection.relation];
            }
        }
    };  

Я был бы благодарен за помощь, так как я новичок в AngularJS.

  • 0
    Похоже, в вашей директиве есть повторение, поэтому область действия, используемая в каждом из полей выбора, одинакова. Возможно, вы хотите иметь директиву для каждой пары блоков выбора, чтобы переменная scope.filteredselect2 содержала разные массивы для каждой пары.
  • 0
    Не могли бы вы привести пример?

1 ответ

1
Лучший ответ

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

dynamicSelect.directive('dynamicSelectPair', function() {
  return {
    scope: {
      rule: '=',
      selects1: '=',
      selects2: '='
    },
    template: '<select ng-model="rule.parameter" ng-options="sel1.name for sel1 in selects1" ng-change="change(rule.parameter)"></select><select ng-options="sel2 for sel2 in filteredselect2" ng-model="rule.relation"></select>',
    link: function(scope) {
      // change the second select content depending on the select item of the first select
        scope.change = function(sel2Selection) {
          scope.filteredselect2 = [];

          for (var key in scope.selects2) { 
            if (angular.isDefined(scope.selects2[key][sel2Selection.relation])) {
              scope.filteredselect2 = scope.selects2[key][sel2Selection.relation];
            }
          }
        };
    }
  }  
});

Затем измените свой HTML-код, чтобы использовать новую директиву в ng-repeat. Обратите внимание, что возможные значения для выбранных могут быть переданы в директиву, поскольку вы уже имеете их во внешней области.

 <div ng-switch-default="ng-switch-default">
        <div dynamic-select-pair selects1='selects1' selects2='selects2' rule='rule'>
 </div>

Вот обновленный Plunkr: http://plnkr.co/edit/Sr1s6I3zleCGr95eYa9e?p=preview

  • 0
    Привет большое спасибо! Это то, что я искал. Еще один вопрос: возможно ли, чтобы выпадающие списки остались в моем html-файле? Проект намного больше с большим количеством html-элементов внутри формы, и я хотел бы хранить все в одном месте.
  • 0
    «Угловой способ» обычно состоит в том, чтобы поместить шаблон в его собственный файл, а затем сослаться на файл, используя свойство «templateUrl» объекта определения директивы вместо встраивания в свойство html «template». Я обновил поршень, чтобы показать это.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню