我使用Angular 1.5.4&材料1.0.6。如果我使用chrome,以下示例的所有内容都可以正常工作。但是,如果我使用safari,则不会预先选择任何值。
组件的模板看起来像
<md-select ng-model="$ctrl.selectedFruit">
<md-option ng-repeat="fruit in $ctrl.fruits" ng-value="fruit" required
ng-selected="$first" >
{{fruit.name}} {{fruit.weight}}
</md-option>
</md-select>
组件看起来像
.component('applicantAccount', {
// @ngInject
bindings: {
selectedFruit: "="
},
controller: function (accountService) {
var ctrl = this;
fruitService.initFruitBefore(function () {
ctrl.fruits= fruitService.getFruits();
});
},
templateUrl: 'views/templates/selectFruitTemplate.html'
});
fruitService:
var fruits = [];
var initFruits = function () {
return $http.get(configuration.apiUrl + "fruits")
.then(function success(response) {
fruits = response.data || []
return response;
})
};
var getFruits = function () {
var filterEx = {type: "fresh"};
return $filter('filter')(fruits , filterEx);
};
var initFruitBefore = function (callback) {
if (!areFruitsAvailable()) {
initFruits().then(callback);
}
else{
callback();
}
};
var areFruitsAvailable = function () {
return typeof fruits[0] !== 'undefined'
};
var getFreshFruit = function () {
var filterEx = {type: "fresh"};
var filtered = $filter('filter')(fruits, filterEx);
return filtered[0] || null;
};
控制器:
fruitService.initFruitBefore(function () {
ctrl.selectedFruit = accountService.getFreshFruit();
ctrl.fruits = accountService.getFruits();
});
奇怪的事情(只有safari)是,ctrl.fruits在初始化selectedFruit之前被初始化(在组件之外)。如果发生这种情况,则会显示短期值。 有谁有想法发生了什么?为什么表现出不同的野生动物园? 谢谢你&amp;抱歉我的英文不好
解决方案
我添加了ng-model-options = {trackBy:'$ value.id'}。
角度材料:
要确定是否选择了某些内容,ngModelController将查看$ scope.selectedUser ==($ scope.users中的任何用户);;
Javascript的==运算符不检查深度相等(即对象上的所有属性是否相同),而是检查对象是否是内存中的同一对象。在这种情况下,我们有两个相同对象的实例,但它们作为唯一实体存在于内存中。因此,select将没有填充所选用户的值。
如需进一步说明,请查看https://material.angularjs.org/latest/api/directive/mdSelect