我遵循了另一个答案的描述,以取消所选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中。
答案 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.forEach
或array.indexOf
代替$.inArray