3
我想了解一個特別奇怪的行爲,我已經注意到了AngularJS。這裏有一個基本的片斷來證明這個問題:AngularJS和null選擇值取決於選擇順序
(function (angular) {
var module = angular.module('test', []);
module.controller('TestCtrl', ['$scope', function ($scope) {
$scope.channels = [
{ name: 'A', id: 1, defSource: 'Y' },
{ name: 'B', id: 2 },
{ name: 'C', id: 3, defSource: 'Z' },
];
$scope.sources = [ 'X', 'Y', 'Z' ];
$scope.model = {};
$scope.channelChanged = function() {
$scope.model.source = $scope.model.channel.defSource;
};
}]);
})(angular);
angular.element(document).ready(function() {
angular.bootstrap(document, ['test']);
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.28/angular.min.js"></script>
<form ng-controller="TestCtrl">
<div>
<label>Channel: <select ng-model="model.channel"
ng-options="channel.name for channel in channels"
ng-change="channelChanged()"></select></label>
</div>
<div>
<label>Source: <select ng-model="model.source"
ng-options="source for source in sources"></select></label>
</div>
<br />
<div>Channel = {{model.channel}}</div>
<div>Source = {{model.source}}</div>
</form>
觀察到的行爲(使用Chrome)是這樣的:
- 選擇通道 「A」;它會按預期自動選擇源「Y」。
- 選擇頻道「B」;它會按預期自動選擇空源。
- 選擇通道「C」;它仍然是一個空源,而不是像預期的那樣選擇「Z」。
- 選擇頻道「A」;它按預期選擇「Y」。
- 選擇通道「C」;它按預期選擇「Z」。
- 選擇頻道「B」;它按預期選擇null,但現在select包含兩個空值。
在所有情況下,模型中的值都是正確的;這只是UI最終獨特的表現。
我可以通過明確提供一個<option>
元素來代表null在源select中,但我不明白爲什麼這個代碼有這種行爲,特別是與「C」的兩種不同行爲取決於事先選擇,以及爲什麼「A」不會做同樣的事情。這是一個已知的AngularJS或Chrome錯誤還是我錯過了一些東西?
好吧,這似乎表現得更好。不過,我認爲我讀了一些關於1.2到1.3遷移的可怕警告。現在看起來不一樣了,但是最後一次檢查1.2仍然被列爲唯一的「穩定」版本。 – Miral
1.3是穩定的。我們在生產中沒有問題地使用它,並且一直在調查遷移到1.4。查看[遷移指南](https://docs.angularjs.org/guide/migration),然後向下滾動到「從1.2遷移到1.3」,查看是否有任何重大更改會影響您。 – Travis