如何在ngOptions中使用非严格匹配为select设置初始ngModel值?
解决AngularJS ngOptions中类型不匹配导致初始值无法设置的问题
当然可以实现类似非严格比较的效果来设置初始值!AngularJS的ngOptions默认是用**严格相等(===)**来匹配ngModel和选项值的,这就是为什么你的整数类型model和字符串类型的option.id没法匹配上——毕竟1 === "1"是false嘛。下面给你几个实用的解决方案:
方案1:统一ngModel和选项值的类型(推荐)
最简单的思路就是让两者类型一致,这样严格相等校验也能匹配成功。
把ngModel转成字符串类型
如果你的选项id是字符串,直接把控制器里的model转成字符串就行:
var app = angular.module('app', []); app.controller('Controller', function($scope) { $scope.model = String(1); // 把整数1转成字符串"1" $scope.options = [ {id: "1", text: "选项1"}, {id: "2", text: "选项2"} ]; });
把选项的id转成整数类型
反过来,如果model必须是整数,就遍历选项把id转成数字:
var app = angular.module('app', []); app.controller('Controller', function($scope) { $scope.model = 1; $scope.options = [ {id: "1", text: "选项1"}, {id: "2", text: "选项2"} ]; // 遍历转换id类型 $scope.options.forEach(opt => { opt.id = parseInt(opt.id, 10); // 或者用Number(opt.id) }); });
方案2:在ngOptions表达式中动态转换类型
如果不想修改原始数据,可以直接在ngOptions里对option.id做类型转换,让生成的选项值和model类型一致:
<div ng-app="app"> <div ng-controller="Controller"> <select data-ng-model="model" data-ng-options="Number(option.id) as option.text for option in options"> </select> </div> </div>
这里用Number(option.id)把字符串ID转成整数,这样选项值就和model的整数类型匹配,严格相等校验就能通过,初始值自然就选中了。
小提示
如果你的数据是从后端接口获取的,建议在数据请求完成后就统一处理好类型(比如把字符串ID转成整数),这样前端模板和控制器里的逻辑会更简洁,也能避免后续其他地方出现类型不匹配的问题。
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

