【问题标题】:AngularJS - Data Model Doesn't Bind in DropdownAngularJS - 数据模型不绑定在下拉列表中
【发布时间】:2018-10-25 22:02:33
【问题描述】:

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 调用从服务器返回到前端的数据对象列表。每个对象都包含三个指向其他对象的属性(ParameterTParameterCParameterN)。

我还有三个对象列表,用作我的三个下拉列表的选项。这三个列表由服务器生成,通过同一个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

用作ng-modelParameterT 对象与ng-options 列表中使用的一个对象相同,但$$hashKey 属性除外。我猜这就是绑定没有发生的原因。 ParameterT 对象是一个子对象,但它的父对象,即主数据对象,确实有一个$$hashKey 属性。

正确吗? 如果是,我该如何解决这个问题? 如果否,我做错了什么?

我可以使用字符串而不是对象来完成所有这些操作,但我会失去根据之前的下拉设置过滤下拉选择的能力。

这目前在生产中有效,因为三个子属性是在前端设置的,通过循环遍历所有数据对象,然后循环遍历三个选项列表来搜索匹配项。这表现不佳,这就是为什么我试图将低效的东西移到服务器上。

【问题讨论】:

  • 在选项中的 angularJS 中,如果您希望默认选择存在,您必须在 ng-model 中传递与选项中完全相同的对象,因此您必须执行类似 $scope.row 的操作。 ParameterT = $scope.pagemodel.ParamTList[0]

标签: javascript html angularjs ng-options


【解决方案1】:

说明:

您需要在每个ng-options 中使用track by 表达式,这是标准做法。

原因是,如果你不这样做,Angular 会在你的重复数据上创建一个 $$hashkey 属性,用于 DOM 更改跟踪。而这个$$hashkey 会导致选择对象无法与您的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"

根据集合中的位置进行跟踪。

这是Working Fiddle

【讨论】:

  • 谢谢.. 我今天到办公室可以试试这个,我假设 $$hashkey 属性是在 ajax 调用后的反序列化过程中添加的。
  • 可以理解但没有。您可以通过记录来自 http 调用的数据并查看没有 $$hashkey 属性来测试它。在 ng-optionsng-repeat 的情况下,它被显式添加到重复模型中,因此 Angular 知道如何在数据更改时正确更新 DOM。但是这个$$hashkey 会导致您的问题,因为现在您的数据对象将与select 对象不匹配。如果您使用 track by,Angular 只会比较指定的 track by 属性而不是整个对象(并且不会添加 $$hashkey。)这是一个 Working Fiddle
  • 我快接近了...track by $index 确实解决了我最初的绑定问题,但现在我的级联过滤器不起作用。 (如我的下拉示例所示,设置第一个下拉列表限制了第二个的选择......并且设置第二个下拉列表限制了第三个的选择)我应该能够在相同的ng-options 子句。正确吗?
  • 是的。检查此过滤器语法:stackoverflow.com/a/21416725/2185093 您可能应该为下拉菜单提出一个新问题。请暂时接受这个答案。
猜你喜欢
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2018-04-26
相关资源
最近更新 更多