AngularJS中如何在select的ng-change中获取month.number值?
解决AngularJS中select的ng-change无法访问ng-repeat内month.number的问题
这个问题其实是AngularJS作用域的典型坑——month是ng-repeat="month in monthsList"创建的子作用域专属变量,而你的select处于父作用域,自然没法直接拿到它的值。给你两个最实用的解决办法:
方法一:把选中的月份存到父作用域变量
这是最直接的方案,核心就是把用户选中的月份同步到父作用域的全局变量里,让select能直接调用:
- 先在控制器里初始化一个存储当前选中月份的变量(可以默认选中第一个月份):
// 假设你的monthsList已经在$scope上,默认选中第一个月 $scope.selectedMonth = $scope.monthsList[0].number;
- 修改你的
setActiveYear函数(说句题外话,这个函数名改成setActiveMonth会更贴切),把选中的月份号同步到全局变量:
$scope.setActiveYear = function(monthNumber) { // 保留你原来的激活状态判断逻辑 $scope.selectedMonth = monthNumber; // 新增这行,把选中月份存到父作用域 };
- 最后更新select的
ng-change,直接用这个全局变量:
<select ng-model="atndYearSelected" ng-options="year for year in atnd_years|orderBy:'-year'" ng-change="getAttendance(atndYearSelected, selectedMonth, infoList['0']['staff_id']);" class="year"> </select>
方法二:利用现有激活状态函数同步月份
既然你已经有isActiveYear函数判断哪个月份处于激活状态,可以直接在这个函数里把激活的月份同步到父作用域:
$scope.isActiveYear = function(monthNumber) { // 保留你原来的激活判断逻辑,比如: var isActive = monthNumber === $scope.currentActiveMonth; // 如果当前月份是激活状态,就同步到父作用域变量 if (isActive) { $scope.selectedMonth = monthNumber; } return isActive; };
之后select的ng-change同样可以直接用selectedMonth变量,和方法一的最后一步一致。
补充:为什么你之前的ng-init无效?
你在<li>里用ng-init的话,变量还是被绑定在ng-repeat创建的子作用域里,父作用域的select根本访问不到,所以完全起不到作用——必须把变量放在父作用域才能实现跨组件的访问。
内容的提问来源于stack exchange,提问作者Yevgeniy Bagackiy
相关产品推荐
相关产品推荐

