AngularJS - модель данных не привязывается в выпадающем меню - PullRequest
0 голосов
/ 26 октября 2018

HTML:

<select class="form-control" name="paramType" ng-change="setParamC($index)" ng-model="row.ParameterT" ng-options="item.ReferenceValue for item in pagemodel.ParamTList" required></select>

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

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

У меня есть список объектов данных, которые возвращаются с сервера во внешний интерфейс посредством вызова ajax.Каждый объект содержит три свойства (ParameterT, ParameterC и ParameterN), которые указывают на другие объекты.

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

3 списка объектов для моих опций раскрывающегося списка и три свойства в моем основном объекте данных имеют одинаковый тип объекта.

Вот данные в моем первом списке, ParamTList, как видно на переднем конце:

(2) [{…}, {…}]
0:
    $$hashKey:"object:503"
    ReferenceCode:1
    ReferenceDomain:"AGG_TIER_PARAMETER_TYPE"
    ReferenceParentCode:null
    ReferenceParentDomain:null
    ReferenceValue:"Static"
    __proto__:Object
1:
    $$hashKey:"object:504"
    ReferenceCode:2
    ReferenceDomain:"AGG_TIER_PARAMETER_TYPE"
    ReferenceParentCode:null
    ReferenceParentDomain:null
    ReferenceValue:"Dynamic"
    __proto__:Object
length:2
__proto__:Array(0)

, а вот объект ParameterT:

{ReferenceDomain: "AGG_TIER_PARAMETER_TYPE", ReferenceCode: 2, ReferenceValue: "Dynamic", ReferenceParentDomain: null, ReferenceParentCode: null}
    ReferenceCode:2
    ReferenceDomain:"AGG_TIER_PARAMETER_TYPE"
    ReferenceParentCode:null
    ReferenceParentDomain:null
    ReferenceValue:"Dynamic"
    __proto__:Object

Объект ParameterT, используемый в качестве ng-model, идентичен одному объекту, используемому в списке ng-options, за исключением свойства $$hashKey.Я предполагаю, что именно поэтому привязка не происходит.Объект ParameterT является дочерним объектом, но его родительский объект, основной объект данных, имеет свойство $$hashKey.

Это правильно?Если ДА, как мне обойти это?Если НЕТ, что я делаю неправильно?

Я мог бы делать все это с помощью строк вместо объектов, но я бы потерял возможность фильтровать выпадающие списки на основе настроек предыдущего выпадающего списка.

В настоящее время это работает в производственном процессе, поскольку три дочерних свойства устанавливаются во внешнем интерфейсе путем циклического перебора всех объектов данных и последующего циклического перебора трех списков параметров для поиска совпадений.Это плохо работает, поэтому я пытаюсь переместить неэффективные подобные вещи на сервер.

1 Ответ

0 голосов
/ 26 октября 2018

Объяснение:

Вы должны использовать выражение track by в каждом из ваших ng-options, что является стандартной практикой.

Причина в том, что еслиЕсли вы этого не сделаете, Angular создает свойство $$hashkey для ваших повторных данных для отслеживания изменений DOM.И это $$hashkey приводит к тому, что объект select не может быть сопоставлен с вашими данными http, у которых нет этого свойства.

Используя track by, Angular просто сравнивает указанное свойство на равенство, а не весь объект (и $$hashkey все равно не добавляется.)

Решение:

Итак, используя ваш ParamT в качестве примера и предполагая, что есть уникальное свойство (например,как ReferenceCode) для каждого объекта, он будет выглядеть следующим образом:

ng-options="item.ReferenceValue for item in pagemodel.ParamTList track by item.ReferenceCode"

В противном случае вы можете попробовать:

ng-options="item.ReferenceValue for item in pagemodel.ParamTList track by $index"

, который отслеживает позицию в коллекции.

Вот Рабочая скрипка ;

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