AngularJS,取消ng-change

时间:2018-07-15 22:13:21

标签: angularjs angularjs-scope angularjs-ng-change

我遵循了另一个答案的描述,以取消所选ng-change上的dropdown.,如果用户在第53周填写了一些数字,则该代码应停止更改年份,如果他切换的年份到不包含第53周。此代码有效,但只有第一次。谁能解释为什么?我的猜测是,这与更改错误的范围有关,但是由于我无法将范围作为参数传递给ng-change,因此我不确定...

这是HTML:

<select data-ng-change="updateYear('{{Year}}');" data-ng-model="Year">
                        <option value="2012">2012</option>
                        <option value="2013">2013</option>
                        ...               
</select>

这是控制器:

$scope.updateYear = function (oldYear) {
    hasValuesInW53($scope.selectedProgram.Uid, function (hasW53Values) {
        var has54weeks = ['2015', '2020', '2026', '2032', '2037'];
        if ($.inArray(oldYear, has54weeks) > -1 && //old year has 53 weeks
            $.inArray($scope.Year, has54weeks) == -1 && //new year does not have 53 weeks
            hasW53Values //has values in W53
        ) {
            $scope.Year = oldYear;  
        }
        else {
            $scope.updateProgram();
        }
    }); 

这就是我的工作

  

将2020切换到2019->正常,取消代码被触发并且GUI   改回来。再次将2020年切换至2019年->不起作用。取消   代码仍被触发,但未反映在GUI中。

2 个答案:

答案 0 :(得分:1)

我发现了一种肮脏的解决方法以解决该问题。令人怀疑的是,在原始解决方案中,引用了错误的作用域,并且由于ng-change不支持传递$ event来引用正确的作用域,因此无法获得正确的作用域。 我的解决方法是添加ng-focus,存储事件,然后使用它来访问正确的作用域。肮脏,但是可以。

HTML:

<select data-ng-model="Year" data-ng-focus="yearFocusCallback($event)" data-ng-change="updateYear('{{Year}}');">
  <option value="2012">2012</option>
  <option value="2013">2013</option>
     ...            
</select> 

控制器:

$scope.yearChangeEvent = null;
$scope.yearFocusCallback = function ($event) {
    $scope.yearChangeEvent = $event;
};
$scope.updateYear = function (oldYear) {
    hasValuesInW53($scope.selectedProgram.Uid, function (hasW53Values) {
        var has54weeks = ['2015', '2020', '2026', '2032', '2037'];
        if ($.inArray(oldYear, has54weeks) > -1 && //old year has 53 weeks
            $.inArray($scope.Year, has54weeks) == -1 && //new year does not have 53 weeks
            hasW53Values //has values in W53
        ) {
            angular.element($scope.yearChangeEvent.target).scope().Year = oldYear;  
        }
        else {
            $scope.updateProgram();
        }
    });  
}

答案 1 :(得分:0)

我的猜测是,这是因为您正在混合angular和jquery,并随时准备获得意外结果,因为angular是数据驱动的,而jquery直接处理DOM元素。尝试使用angular.forEacharray.indexOf代替$.inArray