AngularJS - Dropdown filtering не обновляется при использовании 'track by $ index' - PullRequest
0 голосов
/ 30 октября 2018

HTML:

<tbody ng-repeat="row in pagemodel.Tiering|filteraggregator">
    <!-- more stuff here...  -->
    <select class="form-control" name="paramType" ng-change="setParamC(row.RowID)" ng-model="row.ParameterT" ng-options="item.ReferenceValue for item in pagemodel.ParamTList track by $index" required></select>

    <select class="form-control" name="paramCat" ng-change="validatePCat(row.RowID)" ng-model="row.ParameterC" ng-options="item.ReferenceValue for item in pagemodel.ParamCList|filter:{ReferenceParentCode:row.ParameterT.ReferenceCode , ReferenceParentDomain:row.ParameterT.ReferenceDomain} track by $index" required></select>

    <select class="form-control" name="paramName" ng-change="setParamV(row.RowID,0)" ng-model="row.ParameterN" ng-options="item.ReferenceValue for item in pagemodel.ParamNList|filter:{ReferenceParentCode:row.ParameterC.ReferenceCode , ReferenceParentDomain:row.ParameterC.ReferenceDomain} track by $index" required></select>

</tbody>

Радиально-JS:

tieringController.prototype.setParamC = function(index) {
    var scope = angular.element(document.getElementById("frmtiering")).scope();

    scope.pagemodel.Tiering[index].ParameterC="";
    scope.pagemodel.Tiering[index].ParameterN = "";
    scope.pagemodel.Tiering[index].ParameterValue = "";
    scope.pagemodel.Tiering[index].ValidatePc = false;
}

tieringController.prototype.validatePCat = function (index) {
    // this complex code merely looks for duplicate combinations in the dropdown settings
    var scope = angular.element(document.getElementById("frmtiering")).scope();
    scope.pagemodel.Tiering[index].ValidatePc = false;
    for (var i = 0; i < scope.pagemodel.Tiering.length; i++) {
        if (i != index && scope.pagemodel.Tiering[i].IsActive) {
            if (scope.pagemodel.Tiering[i].AggregatorName == scope.pagemodel.Tiering[index].AggregatorName
            && scope.pagemodel.Tiering[i].ParameterC == scope.pagemodel.Tiering[index].ParameterC) {
            if(scope.pagemodel.Tiering[index].ParameterN !='' && (scope.pagemodel.Tiering[i].ParameterN == scope.pagemodel.Tiering[index].ParameterN))  {
                scope.pagemodel.Tiering[index].ValidatePc = true;
                scope.submitted = false;
                }
            }
        }
    }
}

У меня есть список объектов данных, которые возвращаются с сервера во внешний интерфейс посредством вызова ajax.

Каждый объект содержит три свойства (ParameterT, ParameterC и ParameterN), которые указывают на другие дочерние объекты. Каждое из этих свойств является начальным значением раскрывающегося списка. Чтобы эта привязка работала, мне пришлось добавить track by $index, но это «сломало» мою фильтрацию.

Я использую фильтрацию для обновления доступных параметров во втором и третьем раскрывающемся списке. Таким образом, настройка первого раскрывающегося списка приводит к тому, что второй раскрывающийся список отображает другой набор параметров посредством фильтрации. Настройка второго раскрывающегося списка приводит к тому, что третий раскрывающийся список отображает другой набор параметров посредством фильтрации.

Это работает правильно, если track by $index НЕ включено. Когда я включаю track by $index, фильтрация больше не работает. Первоначальный набор параметров правильно включен в список, но при изменении первого раскрывающегося списка он больше не обновляет набор параметров для второго раскрывающегося списка.

EDIT:

Без track by $index Вот как выглядят мои выпадающие списки:

<select class="form-control ng-pristine ng-valid ng-valid-required ng-touched" name="paramType" ng-change="setParamC(row.RowID)" ng-model="row.ParameterT" ng-options="item.ReferenceValue for item in pagemodel.ParamTList" required="">
    <option value="?" selected="selected"></option>
    <option label="Static" value="object:478">Static</option>
    <option label="Dynamic" value="object:479">Dynamic</option>
</select>

С track by $index вот как выглядят мои выпадающие списки:

<select class="form-control ng-pristine ng-valid ng-valid-required ng-touched" name="paramType" ng-change="setParamC(row.RowID)" ng-model="row.ParameterT" ng-options="item.ReferenceValue for item in pagemodel.ParamTList track by $index" required="">
    <option label="Static" value="0">Static</option>
    <option label="Dynamic" value="0" selected="selected">Dynamic</option>
</select>

вы заметите, что с track by $index значение моего параметра будет нулевым. Вероятно, поэтому каскадные выпадающие меню не фильтруются правильно.

Так ... я что-то не так сделал?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...