AngularJS - 在 ng-repeat 中设置默认值 [重复]

Posted

技术标签:

【中文标题】AngularJS - 在 ng-repeat 中设置默认值 [重复]【英文标题】:AngularJS - Set default value on select inside a ng-repeat [duplicate] 【发布时间】:2015-07-17 06:26:06 【问题描述】:

我遇到了 AngularJS 的问题 - 我无法在 <select> 中显示所选值。

这是我的用例:

我有一个以 ng-repeat 开头的视图来显示组件。每个组件都包含一个用于选择增值税率的选项。创建新项目时,它看起来不错。但是当我编辑现有项目时,实际的增值税代码不会显示在选择中,而是看到默认选项“-- 选择增值税率--”而不是所选的增值税。

我的模型仅包含增值税率的 ID。

对于单个组件,我可以使用 $scope 中的变量来设置当前项目值,但在这里我可以有多个组件,每个组件都有自己的增值税率,所以我不知道如何在此处执行此操作:

这是我的代码

<div ng-repeat="i in items">
   <label>i.id</label>
   <input ng-model="i.title">
   <select ng-model="i.vatRateId">
      <option value="">--- Select an option ---</option>
      <option ng-repeat="value in vatRates"
              ng-selected="i.vatRateId == value.id"
              value="value.id">value.value     
      </option>
   </select>
</div>

还有对象:

$scope.vatRates = [
     'id': 1, 'value' : '20' ,
     'id': 2, 'value' : '10' ,
     'id': 3, 'value' : '7' 
];

$scope.items = [
     'id': 1, 'title' : 'Title1', 'vatRateId' : '1' ,
     'id': 2, 'title' : 'Title2', 'vatRateId' : '2' ,
     'id': 3, 'title' : 'Title3', 'vatRateId' : '3' 
];

这是一个现场演示来解释我的问题:

Demo on PLNKR

我无法为每个项目设置正确的选择值。

【问题讨论】:

当然,我们可以帮助您。但是你能先帮助我们吗?通过删除标记和样式的不相关部分来帮助我们?然后,为了避免猜测和假设,让我们了解您使用的一些对象和一些函数的结构,例如updateVatRatesettings?为了额外的奖励,也许将一些变量/文本翻译成英文(看看这是一个英文网站)。我为您修复了一些问题 - 请添加有关丢失代码的更多详细信息,下次请花时间解决您的问题。 感谢@NewDev,我想我已经很清楚了 ^^ 没关系,这里有一个现场演示来解释我的问题。 plnkr.co/edit/OROLI64Q13PlJhSE4GOl?p=preview我无法为每个项目设置正确的值 你有一个演示很好,但问题应该是独立的 - 我更新了它,如果你觉得它没有反映你的实际问题,请修复编辑。 accept 答案有太多问题,对其他读者有用。 【参考方案1】:
<select ng-model="val" ng-init="myval = vals[0]">
    <option ng-repeat="myval in vals" value="myval.value">val.name
    </option>
</select>

【讨论】:

欲了解更多信息,请参阅AngularJS API Reference - Using ngRepeat to generate select options。【参考方案2】:

您应该通过控制器而不是 ng-init 在 ng-model 上设置默认值。来自docs

ngInit 唯一合适的用途是为 ngRepeat 的特殊属性设置别名,如下面的演示所示。除了这种情况,您应该使用控制器而不是 ngInit 来初始化作用域上的值。

— AngularJS ng-init Directive API Reference - Overview

angular.module('app', [])
.controller('SelectController', function() 

    var selectCtrl = this;
  selectCtrl.values = ["Value 1", "Value 2", "Value 3"];
  selectCtrl.selectedValue = "Value 1";
)
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app="app" ng-controller="SelectController as selectCtrl">
<select ng-model="selectCtrl.selectedValue"> 
  <option ng-repeat="value in selectCtrl.values" value="value">value     </option> 
  </select>
</div>

【讨论】:

但是你不能切换选项【参考方案3】:

我不太清楚您的要求,但如果您想将默认选择值显示为&lt;select&gt;,您可以使用 ng-selected。为了使用它,您需要在控制器中将 default selected value 作为 model 到您的 &lt;select&gt; 并将 ng-selected 添加到您的 &lt;options ng-selected="defaultvalue == value.id" ng-repeat="value in vatRates"&gt;

对于代码和参考,我刚刚更改了您的 plunker,

http://embed.plnkr.co/ZXo8n0jE8r3LsgdhR0QP/preview

希望这会有所帮助。

【讨论】:

是的,这正是我需要的!!!非常感谢 !! ;) 很高兴您的问题得到解决!! :) 万一您将默认值设置为已知字符串值,例如“Matt”,您不能只使用ng-selected="'Matt'"。您的已知字符串需要等同于该值,即ng-selected=" value == 'Matt' " 如果您在选择上使用ngModel,则不应在选项上使用ngSelected,因为ngModel 将设置选择值和选定选项。见AngularJS ng-selected Directive API Reference。 ng-selected 属性不应使用大括号 进行插值。见AngularJS Developer Guide - Binding to boolean attributes。另见AngularJS Developer Guide - Why mixing interpolation and expressions is bad practice。【参考方案4】:

这是我设法做到这一点的唯一方法,并且当另一个选择发生变化时它就完成了。 (也许这就是其他解决方案不起作用的原因,请注意额外的 ""+ 以强制它为字符串。(否则不起作用)

在控制器中:

$scope.formData.number_of_persons = "̲"̲+̲ $scope.numberOfPersons[0].val;

html

<select name="number_of_persons" 
        id="number_of_persons" 
        ng-model="formData.number_of_persons" 
        required>
    <option ng-repeat="option in numberOfPersons" value="option.val">
        option.val
    </option>
</select>

【讨论】:

另一个选项是使用ng-value 指令,该指令允许将值设置为字符串以外的值。 见AngularJS select Directive API Reference - Using ngValue to bind the model to an array of objects。

以上是关于AngularJS - 在 ng-repeat 中设置默认值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 AngularJS 中使用同位素(ng-repeat)

在 AngularJs 中迭代 ng-repeat 仅 X 次

关于angularjs的ng-repeat指令

angularjs 在 ng-repeat 指令中预填充输入文本

在 angularjs 中使用 ng-repeat 创建动态表

AngularJS - 在 ng-repeat 中设置默认值 [重复]