Angularjs 从最终1.3 rc移至1.3.0-<;选择>;之后的期权问题<;选择>;移动中的错误修复

Angularjs 从最终1.3 rc移至1.3.0-<;选择>;之后的期权问题<;选择>;移动中的错误修复,angularjs,Angularjs,我的应用程序具有以下HTML: <select id="contentTypeSelect" ng-change="home.configChanged(true)" ng-model="ctrl.configService.admin.contentTypeId" ng-options="item.id as item.name for item in content"></select> 我的问题是,它创建了一个带有空白条目的select: <

我的应用程序具有以下HTML:

<select id="contentTypeSelect"
   ng-change="home.configChanged(true)"
   ng-model="ctrl.configService.admin.contentTypeId"
   ng-options="item.id as item.name for item in content"></select>
我的问题是,它创建了一个带有空白条目的select:

<select id="contentTypeSelect" 
   ng-change="home.configChanged(true)" 
   ng-model="ctrl.configService.admin.contentTypeId" 
   ng-options="item.id as item.name for item in content" 
     class="ng-pristine ng-untouched ng-valid">
   <option value="? string: ?">
   </option><option value="0" selected="selected">*</option>
   <option value="1">Menu</option>
   <option value="2">Service</option>
   <option value="3">Help</option>
   <option value="4">Product</option>
   <option value="5">Version</option>
   <option value="6">Exam</option>
   <option value="7">Track</option>
</select>
首先,我在self.content中填充数据,然后将模式设置为该数组第一个元素的id

注意,这只是生产1.3版本的一个问题。我没有看到这个问题与测试版

> @license AngularJS v1.3.0-beta.8 // This release is working for me
> @license AngularJS v1.3.0-rc.3   // This release is working for me
> @license AngularJS v1.3.0-rc.5   // This release is working for me
> @license AngularJS v1.3.0        // This release is failing for me
我现在假设此更改是rc5和生产版本之间进行的以下更改的结果:

1.3.0 superluminal-nudge (2014-10-13)
Bug Fixes
select:
add basic track by and select as support (addfff3c, #6564)
manage select controller options correctly (2435e2b8, #9418)
我会调查的。希望bug修复没有引入我所面临的新bug。当然,我的代码现在似乎可以在1.3.0之前的所有版本中工作

请注意我的申请工作的顺序

a) 打开HTML b) 获取选择列表的数据(需要5秒) c) 填充ng选项 d) 填充ng模型


这可能是与在1.3.0发布之前添加到选项中的bug修复有关的问题。我的代码已经运行了一年了,突然间,只有在最新的1.3.0版本中才出现了这个问题

此附加选项是因为默认情况下未选择任何项目。如果将ctrl.configService.admin.contentTypeId设置为项目列表中的有效ID,则将选择其中一个,并且您将不再看到此附加选项的值?

因此,这是由于未定义任何选择或存在错误而无法确定所选项目造成的

更新:
我将AngularJS版本更改为1.3,它的行为仍如预期的那样

更新2:
最终,您应该通过调用$scope.apply()来传播self.configService.admin.contentTypeId的新值

更新3:
添加了一个异步函数,用于模拟从服务获取数据。
如果不调用$apply(),Angular就无法知道任何$scope值都已更改,因为没有可以触发更新的事件。所以你必须告诉Angular你改变了一些值。如果删除$apply()调用,则简单消息文本不会得到更新,则可以看到这一点。

更新4:
正如Yoshi解释的那样,将setTimeout更改为$timeout,因为$apply()不是必需的

示例:

var myApp=angular.module('myApp',[]);
控制器('MyCtrl',函数($scope,$timeout){
$scope.status='loading…';
$scope.getData=函数(){
$timeout(函数(){
$scope.selectedItem=0;
$scope.content=
[{“id”:0,“name”:“*”},
{“id”:1,“name”:“Menu”},
{“id”:2,“name”:“Service”},
{“id”:3,“name”:“Help”}]
$scope.status='calldone!';
}, 1000);
};
});

状态:{{Status}}

这似乎是
v1.3.0
的一个已知错误(请参阅:和)

该错误在某种程度上是由
ngOptions
模型数据的异步分配和使用错误标识符(例如
'
0
)预先选择值触发的。它可以复制如下:

(功能(应用程序,ng){
"严格使用",;
app.controller('AppCtrl',['$timeout',函数($timeout){
var vm=这个;
$timeout(函数(){
vm.content=[
{id:0,名称:'A'},
{id:1,名称:'B'},
{id:2,名称:'C'}
];
}, 1000);
}]);
}(角度模块('app',[]),角度)


为选项列表中的“模型”指定一个值。是否可以添加一个完整的可执行示例,显示错误行为(可能在plnkr.co或类似网站上)?因为目前,即使是v1.3.0,我也无法重现您的问题。@Yoshi-我想Dennis可能已经这样做了,但我不确定如何将他的版本转换为plnkr.co。我的代码有大约40个选择框,它们是以这种方式填充的。所有这些行为都是一样的。您是否注意到在1.3.0发行版之前为选择选项所做的修复。我的代码已经为AngularJS的每个版本工作了一年多,直到这个最新版本。@marifemac也许你可以使用并添加部分代码,直到它崩溃为止?@Yoshi-谢谢。关于你的代码,我注意到一件事。在我的应用程序中,我打开HTML,最初没有设置ng模型值。然后我得到数据,5秒钟后我填充内容,然后填充ng模型。我想知道这个问题是否与我稍后在过程中而不是像您的示例中那样立即获取数据有关?我的代码确实设置了值。我更新了问题以显示这一点。我注意到您的示例使用的是AngularJS 1.2.23。我的问题似乎出现在Angular 1.3(最新版本)上。在最终的1.3版本之前,我更新了我的答案,对发布版本进行了更多检查。在最终的1.3.0版本之前,所有这些都可以完美地工作。我注意到那次释放有一点。该版本中的选项有错误修复。我现在正在看。但是,由于在1.3.0版本中通过之前的版本和失败是如此一致,我认为这是“错误修复”的结果。在最终的1.3版本之前,我更新了我的答案,对版本进行了更多的检查。在最终的1.3.0版本之前,所有这些都可以完美地工作。我注意到那次释放有一点。该版本中的选项有错误修复。我现在正在看。但由于在1.3.0中通过Previor和失败是如此一致,我认为这是“错误修复”的结果。@DenisThomas
$apply
仅在对外部事件(例如jQuery、navigator.geolocation和类似事件)做出反应时才需要。如果仅使用angular,则永远不需要$apply。@DenisThomas angular正在监视所有范围(模型)值,如果检测到更改,则更新dom(视图)。观察者在每个消化循环中被触发,然后依次
self.content = results[2];
self.configService.admin.contentTypeId = self.content[0].id;
> @license AngularJS v1.3.0-beta.8 // This release is working for me
> @license AngularJS v1.3.0-rc.3   // This release is working for me
> @license AngularJS v1.3.0-rc.5   // This release is working for me
> @license AngularJS v1.3.0        // This release is failing for me
1.3.0 superluminal-nudge (2014-10-13)
Bug Fixes
select:
add basic track by and select as support (addfff3c, #6564)
manage select controller options correctly (2435e2b8, #9418)