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();
}
});
}