为什么在angularJS 1.3中,美元手表、承诺和ng选项的组合表现不同?

为什么在angularJS 1.3中,美元手表、承诺和ng选项的组合表现不同?,angularjs,promise,watch,ng-options,Angularjs,Promise,Watch,Ng Options,从angularJS 1.2升级到1.3后,我遇到了ng选项的问题。浏览器中不显示选定的值 我有一个HTML选择: <select ng-model="selectedField" ng-options="field for field in fields"></select> 使用angularJS 1.2设置selectedField并加载字段(通过承诺)后,效果良好。 但是,对于angularJS 1.3,不会显示选定的值 通过使用“track by”选项更

从angularJS 1.2升级到1.3后,我遇到了ng选项的问题。浏览器中不显示选定的值

我有一个HTML选择:

<select ng-model="selectedField" ng-options="field for field in fields"></select>

使用angularJS 1.2设置selectedField并加载字段(通过承诺)后,效果良好。 但是,对于angularJS 1.3,不会显示选定的值

通过使用“track by”选项更改ng选项查询,使其再次在angularJS 1.3中工作

<select ng-model="selectedField" ng-options="field for field in fields track by field"></select>

这是我偶然发现的。在这种情况下,不需要“track by”,因为字段是字符串列表。selectedField也是一个字符串。因此,ng选项使用的默认比较应该有效

这行得通,但我不高兴。这毫无意义,我需要一个我理解的解决方案

我继续研究这个问题,发现使用$watch将数据加载到$scope.fields中是一种“有毒”组合

  • 如果我直接从控制器调用promise,那么它在angularJS 1.3中运行良好
  • 如果我绑定$watch中的值列表,那么它也可以正常工作
  • 如果我同时使用($watch和promise),它就会崩溃
给我看代码!

在Plunker中有三种情况:

  • 案例1:在1.3中,只有promise和ng选项可以正常工作
  • 案例2:在1.3中,只有$watch和ng选项可以正常工作
  • 案例3:$watch、promise和ng选项在1.3中不起作用
再次提及:如果我添加“跟踪方式”选项,所有案例都可以正常工作。或者使用angularJS 1.2

有人能解释为什么在使用angularJS 1.3时案例3不再起作用了吗。 在这种情况下,使用“跟踪方式”看起来像是一种黑客行为,感觉不太对劲。 最重要的是,我想了解我的代码是如何工作的

Blazemonger观察良好:选择了两个选项=“selected”:

在两个选择中,选择两个值


但是是什么(在angular 1.3中?)导致了这种情况?

所有情况对我都有效,至少在你的Plunker中。@Blackhole note-不起作用意味着第一个下拉列表没有选择正确的默认值。我可以复制这个。不正确确实意味着第一个下拉列表没有显示所选的值。如果使用choose case 2.1或case 2.2,请确保case 1下面的行再次被注释掉。我注意到在DOM检查器中,在case 2.1中,有两个选项
selected=“selected”
,但在case 1和2.2中,只有一个选项是@Blackhole thx。在Firefox中确实没有问题。我自己查过了。但是IE和Chrome有麻烦。