【问题标题】:ng-options adding "string:" in value and not updating ng-modelng-options 在值中添加“string:”而不更新 ng-model
【发布时间】:2016-06-13 13:47:19
【问题描述】:

我有这样的数据:

"RequirementLevels": {
 "285960000":"Black",
 "285960001":"Green",
 "285960002":"Blue",
 "285960003":"Purple"
}

我有一个这样的选择:

<select ng-options="key as value for (key , value) in Variables.Template.RequirementLevels"
        ng-model="Variables.EditingNode.RequirementLevel"
        ng-model-options="{ debounce: 300 }"></select>
<span>"{{Variables.EditingNode.RequirementLevel}}"</span>

这会生成以下 html:

注意选择选项中每个值前面的string:。使用下面的代码,我没有在值中得到string:

<select ng-model="Variables.EditingNode.RequirementLevel">
     <option ng-repeat="(key, value) in Variables.Template.RequirementLevels" value="{{key}}">{{value}}</option>
</select>

我的问题是为什么我会在 ng-option 列表中获得 string: 以及如何让它消失。

更新因为 cmets:我想更改它的原因是,当值中有 string: 时,ng-model 值不起作用。我认为这是因为它与模型中带有“123”的选项集中的“string:123”不匹配。

更新 2

这是创建选择的 Html。

<div class="form-group input-group">
    <label for="ReviewDone">Requirement level</label>
    <select ng-options="key as value for (key , value) in Variables.Template.RequirementLevels track by key"
            ng-model="Variables.EditingNode.RequirementLevel"
            ng-model-options="{ debounce: 300 }"></select>
    <span>"{{Variables.EditingNode.RequirementLevel}}"</span>
</div>

这会创建带有选项的选择,但不会选择默认值。它正下方的跨度显示 ng-model 变量的内容,但是工作正常并打印选项列表中的数字“285960002”,因此应该从列表中选择它开始。

上面的代码生成了这个 HTML:

<div class="form-group input-group">
    <label for="ReviewDone">Requirement level</label>
    <select class="ng-pristine ng-untouched ng-valid" ng-model="Variables.EditingNode.RequirementLevel" ng-model-options="{ debounce: 300 }" ng-options="key as value for (key , value) in Variables.Template.RequirementLevels track by key"><option selected="selected" value="?"></option><option value="285960000" label="Black">Black</option><option value="285960001" label="Green">Green</option><option value="285960002" label="Blue">Blue</option><option value="285960003" label="Purple">Purple</option></select>
    <span class="ng-binding">"285960002"</span>
</div>

同样在 select 中选择不同的值会改变 span 中的值,因此它会更新值但在加载时不会读取它。

【问题讨论】:

  • 您看到的值是项目的哈希键。这是 Angular ng-options 的正常行为,您的应用程序逻辑不应受到影响,因为它不会更改返回到 ng-model 的值。
  • @Claies:查看问题更新:我相信 ng-model 值在字符串部分存在时无法正常工作。
  • @Claies 嗯,我可能错了,虽然当我在更改下拉列表后检查变量时它是正确的,但它不会从一开始就将下拉列表设置为一个值,即使变量由 ng-model 分配的值显然与选项匹配。
  • 更新 plunker,显示设置默认值:plnkr.co/edit/zDlwdHUTQU4q18PX0PF7?p=preview

标签: angularjs


【解决方案1】:

如果您想让这个额外的字符串按照您的要求消失,请使用 track by key

<select ng-options="key as value for (key , value) in Variables.Template.RequirementLevels track by key"

请参阅 plunker 以供参考

http://plnkr.co/edit/fi8lLyjkS0y3hfX7aeNI?p=preview

【讨论】:

  • 你可能想要track by key,而不是valuetrack by value 导致下拉列表空白选择。
  • @Claies 是的,我尝试按键跟踪,它确实删除了字符串:,但我想解决的问题仍然存在,正如你所说的那样。
  • 有什么问题??感谢@Claies 指出我已经在帖子中纠正了这一点。