【问题标题】:Dropdown doesn't select value from model in Angularjs下拉菜单不会从 Angularjs 中的模型中选择值
【发布时间】:2015-05-14 14:23:44
【问题描述】:

我有一个 select 元素,它呈现一个对象列表,没什么特别的。

<select ng-model="defaultObject" ng-options="obj.description for obj in allObjects">
</select>

生成:

<select ng-model="defaultObject" ng-options="obj.description for obj in allObjects">
            <option value="?" selected="selected" label=""></option>
            <option value="0" label="Value 1">Value1</option>
</select>

而且看起来不错。它会生成第一个空选项,因为在渲染时 allObjects 尚未创建,所以这是预期的。

但是,问题在于,当defaultObject 模型设置为代表选择元素内的第二个选项的对象时(Value1),选择元素不会更新所选选项,一切看起来都一样。这就像一个单向绑定,defaultObject 模型可以从下拉列表中设置,但更新defaultObject 不会更新下拉列表以选择该元素。这可以解决吗?

【问题讨论】:

  • $scope.defaultObject = $scope.allObjects[0] 如果模型是一个对象,你应该通过引用传递它
  • 你这里有个小错误:obj.description for object:objobject应该同名。
  • 是的,只是笔误,我改名了实名
  • 在控制器中将 defaultObject 绑定到 $scope ...
  • @Zed:太好了。请看我的回答,我有几个可用的选项。

标签: javascript angularjs


【解决方案1】:

您的代码错误,请尝试使用此代码而不是您的代码(将 obj 更改为 ng-option 中的对象)

<select ng-model="defaultObject" ng-options="object.description for object 
in allObjects"> 
<option ng-if="!defaultObject" value="">Select Object</option>
</select>

您只需为默认选择添加一个选项。

【讨论】:

  • 这个答案不起作用。如果设置了defaultObject,则 select 仍然不会选择正确的项目,原因我在回答中解释了。
【解决方案2】:

问题是 angular 似乎使用== 来检查数组中的哪些项目已被选中。在 JavaScript 中,包含相同数据的两个对象仍然不是相同的对象,它们是对不同对象的引用:

{a: 1} == {a: 1} // false

最简单的解决方案是在控制器中手动将模型设置为数组中的一个项目:

$scope.defaultObject = $scope.allObjects[0];
// (Or some other index that exists in the array)

另一种选择是将&lt;select&gt; 绑定到对象中的特定值,而不是对象本身:

<select
    ng-model="defaultObject"
    ng-options="obj.id as obj.description for obj in allObjects">
</select> <!--       ^ bound value,   ^ display value -->

这将导致选定的objid 存储在$scope.defaultObject 中,并且在页面加载时,将选择objid 中设置的$scope.defaultObject

这里的缺点是您的模型不包含完整的选定对象,只有id 属性。

【讨论】:

  • obj.id as obj.description 是什么意思?你在哪里声明obj
  • @RameshRajendran:错字,从 OP 复制,但现在已修复。那么,我的回答实际上有什么错误吗?如果是这样,我想从中学习。
  • 所以,现在我尝试了你的第一种方法,并且 $scope.defaultObject == $scope.allObjects[1] 是真的,但是下拉菜单仍然没有更新。下一步我应该看哪里?
  • $scope.allObjects[1] 是否存在,还是undefined
  • @Cerbrus 抱歉,您的方法确实有效,只是我的部分代码在将 defaultObject 设置为数组中的值后更改了它。我只是期望 Angular 比这更聪明。
猜你喜欢
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 2019-07-30
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多