Angular select 元素上的 ng-repeat 空选项在离开状态时导致错误

Angular ng-repeat empty option on select element causes error when leaving state

我使用 ng-repeat 指令为 angular.js 中的 <select> 元素动态生成一些选项。

我使用 ng-repeat 而不是 ng-options 因为这是一个空表单,我想设置一个 selecteddisabled 默认值,以及一个最终选项不在模型中。

var form = {}; // to be filled with form data, including form.boro

var boros = {"BK":"brooklyn","Q":"queens","NY":"manhattan","BX":"bronx","SI":"staten island"}

<select class='form-control capitalize' name="city" ng-model='form.boro' >
    <option value="" >City</option> 
    <option ng-repeat="(k, val) in boros" value="{{k}}">{{val}}</option>
    <option value='other'>Other</option>
</select>

这生成了预期的元素和选项,但导致抛出以下错误:

TypeError: Cannot read property '$$phase' of null

此错误是由于在 <option value="">City</option>

中设置 value=""

该应用程序仍在运行并且没有崩溃,但我很好奇为什么在状态退出时会发生这种情况,如果我做错了什么。

我认为问题出在选项中的 {{city}} 上,我猜这没有可用的模型。如果我们同时打印 {{boro}} 作为值和 {{city}} 作为文本,我们需要在 city 与 boro 中建立关系。或者你可以把所有的城市放在一个对象数组中,并通过将 boro 键发送到控制器函数来获取城市的值,并像 {{getCity(boro)}} 一样获取城市并将 boro 设置为 ng-model="boro “

我试过重现你的代码示例,如果我理解得很好,问题实际上是你没有把你的对象放在数组中,我相信 ng-repeat 在对象集合中执行。您可以按照以下格式将您的选项放入数组中,例如[{代码:BQ,城市:布鲁克林}]。往下看

app.controller('MainCtrl', function($scope) {
    $scope.form = {}; 
    $scope.boros = [
      {code: "BK", city: "brooklyn"}, 
      {code: "Q", city: "queens"},
      {code: "NY", city: "manhattan"},
      {code: "BX", city: "bronx"},
      {code: "SI", city:"staten island"}
    ]
});

还有你的模板:

<select class='form-control capitalize' name="city" ng-model='form.boro' >
    <option value="" >City</option> 
    <option ng-repeat="boro in boros track by $index" value="{{boro}}">{{boro.city}}</option>
    <option value='other'>Other</option>
</select>

在 plunker 中检查 this

看起来将 selected disabled 放在空的初始选项上可以清除错误。

<option value="" selected disabled >City</option> 

我有点疏忽:/