AngularJS,取消更改

AngularJS,取消更改,angularjs,angularjs-scope,angularjs-ng-change,Angularjs,Angularjs Scope,Angularjs Ng Change,我按照另一个答案的描述,在选择下拉列表中取消ng change。如果用户在第53周填写了一些数字,如果他切换到的年份不包含第53周,则代码应停止更改年份。这段代码有效,但只是第一次。有人能解释为什么吗?我的猜测是,它与更改错误的范围有关,但由于我无法将范围作为参数传递给ng change,我真的不确定 这是HTML: <select data-ng-change="updateYear('{{Year}}');" data-ng-model="Year">

我按照另一个答案的描述,在选择
下拉列表中取消
ng change
如果用户在第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>
我就是这么做的:

切换2020至2019->正常工作,触发取消代码并返回GUI 换回来了。Swotch 2020年至2019年再次->不起作用。取消 代码仍然会被触发,但不会反映在GUI中)


我的猜测是,这是因为您将angular和jquery混合在一起,并随时准备得到意外的结果,因为angular是数据驱动的,而jquery直接处理DOM元素。尝试使用
angular.forEach
array.indexOf
而不是
$。inArray

我找到了一个解决问题的方法。正如所怀疑的,在原始解决方案中,引用了错误的范围,而我无法获得正确的范围,因为ng change不支持传递$event,我可以在其中引用正确的范围。 我的解决方法是添加ng焦点,存储事件,并使用它访问正确的范围。脏的,但有用

HTML:


我尝试了这个解决方案,但不幸的是,它不起作用,我只是得到了同样的问题。
$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();
        }
    }); 
<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();
        }
    });  
}