【问题标题】:AngularJS - ng-option dropdown list not setting ng-model value when False selectedAngularJS - 选择 False 时,ng-option 下拉列表未设置 ng-model 值
【发布时间】:2020-04-05 20:50:19
【问题描述】:

我有一个<select> 元素,它使用ng-options 生成选择列表,并希望将选择的值设置为ng-model 的值。这是我的html:

<td style="text-align:center">
    <ng-form name="IsTobaccoForm">
        <select name="Input" required ng-model="dep.IsTobacco" ng-options="item.value as item.text for item in yesNoList"></select>{{dep.IsTobacco}}
        <span class="alert-error" ng-show="IsTobaccoForm.Input.$error.required"><strong>*Required</strong></span>
    </ng-form>
</td>

我的控制器包含以下代码:

$scope.yesNoList = [{ value: true, text: 'Y' }, { value: false, text: 'N'}];

如果项目的IsTobacco 值为真,则该值设置正确,一切正常。但是,如果它为 false,则会出现所需的错误,即使 {{dep.IsTobacco}} 呈现为 false。真正奇怪的部分是,如果我将列表中的选定项更改为 true,它可以正常工作,但是如果我将其设置为 false,则会将一个新的空白项添加到列表中并选择该空白项。

如果问题似乎不在上面发布的行中,我很乐意发布更多代码。

谢谢!

编辑:我还使用了 chrome 调试器,看到在 Angular 中启动数据时,IsTobacco 的值等于 false

编辑 2: 如果有人看到这篇文章是 AngularJS 的新手,我绝对推荐阅读这两篇文章:part 1part 2。它们是 AngularJS 表单的概述。

【问题讨论】:

  • 由于某种原因(可能与复选框有关?),false 的值在与required - github.com/angular/angular.js/issues/2436 一起使用时被解释为缺少ngModel。一种解决方法是改用字符串“true”和“false”。
  • @sh0ber 哦,伙计。这不好哈哈。感谢您提供这方面的信息。我一直在强迫自己不要破解解决方法,假设是我缺乏角度知识导致了这个问题。
  • 没问题,我自己没有意识到这一点。考虑到复选框可以采用ng-true-valueng-false-value 属性,它可能不需要这样。但我想要么是这样,要么在每个复选框上强制使用这些属性的非真和非假值,这是更好的选择。
  • 是的,这绝对是有道理的。将ng-options 与复选框一起使用时,我没有考虑过后果。
  • 现在作为答案发布:)

标签: javascript html angularjs ng-options angularjs-forms


【解决方案1】:

发生这种情况的原因是false 的值在与required 一起使用时被解释为缺少ngModel。正如 here 所讨论的,请考虑 Angular 源代码的以下摘录:

var validator = function(value) {
    if (attr.required && (isEmpty(value) || value === false)) {
        ctrl.$setValidity('required', false);

如果有一个必需的属性并且它的值为false,它不会通过验证。这可能是为了更容易验证所需的复选框而故意的,在这种情况下,未选中的默认值为false

考虑到复选框可以采用ng-true-valueng-false-value 属性,可能不需要这样,但我想要么这样做,要么强制使用非true 和非false 值对于每个复选框上的这些属性,这是更好的选择。

一种解决方法是改用字符串“true”和“false”。

【讨论】:

  • sh0ber 已经提到了复选框的使用,但我觉得应该进一步强调这一点。我更改了我的代码以使用“是”和“否”,然后意识到我在不需要时进行黑客攻击。使用复选框。
猜你喜欢
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 2018-09-08
  • 2015-01-27
  • 2017-01-03
  • 2013-12-10
  • 1970-01-01
相关资源
最近更新 更多