防止从 Angular 指令回发
Prevent postback from Angular directive
我有一个 runat="server"
锚,在 href
中有 __doPostBack
。
我想在单击锚点时验证是否已完成另一个字段,并且仅当该字段不为空时才允许回发。
我添加了一个自定义指令来处理这个问题,如下所示:
angular.module('app').directive('notEmpty', function ($timeout, $document) {
return {
restrict: 'A',
link: function (scope, element, attrs) {
element.bind('click', function (event) {
return $timeout(function () {
var elementToCheckNotEmpty = $document[0].querySelector(attrs.notEmpty);
if (!elementToCheckNotEmpty.value) {
scope.addInvalidClass = true; // input has an ng-class binding to $scope.addInvalidClass
event.preventDefault();
event.stopPropagation();
return false;
}
});
});
}
}
});
这不会阻止回发。更新 scope
属性 并将 class 添加到输入是有效的,因为我看到无效的 class 在回发发生时应用了几秒钟。
我明白 $timeout
returns 是一个承诺,所以我尝试将 then 链接到 $timeout
上,如下所示:
return $timeout(function () {
var elementToCheckNotEmpty = $document[0].querySelector(attrs.omwNotEmpty);
if (!elementToCheckNotEmpty.value) {
scope.addInvalidClass = true;
}
}).then(function () {
if (scope.addInvalidClass) {
event.preventDefault();
event.stopPropagation();
return false;
}
});
但这也不能阻止回发。这是一个带有共享主页的 webforms 项目,所以我无法在不影响许多其他页面的情况下真正更新 form
元素。该表单确实有一个空的 action
属性。此外,ng-controller
属性位于 内部 元素 form
元素上,不确定这是否有所不同...
我做错了什么?我是 Angular 的新手,顺便说一句,如果这是微不足道的,我深表歉意!
使用 $timeout 将函数添加到异步队列,从而不会阻止回发。当不使用 $timeout 服务时绑定不会改变,因为点击不在 angular 摘要周期内。而不是 $timeout 将范围更改包含在 scope.$apply() 中,或者您可以只使用 ng-click 而不是 element.bind.
我有一个 runat="server"
锚,在 href
中有 __doPostBack
。
我想在单击锚点时验证是否已完成另一个字段,并且仅当该字段不为空时才允许回发。
我添加了一个自定义指令来处理这个问题,如下所示:
angular.module('app').directive('notEmpty', function ($timeout, $document) {
return {
restrict: 'A',
link: function (scope, element, attrs) {
element.bind('click', function (event) {
return $timeout(function () {
var elementToCheckNotEmpty = $document[0].querySelector(attrs.notEmpty);
if (!elementToCheckNotEmpty.value) {
scope.addInvalidClass = true; // input has an ng-class binding to $scope.addInvalidClass
event.preventDefault();
event.stopPropagation();
return false;
}
});
});
}
}
});
这不会阻止回发。更新 scope
属性 并将 class 添加到输入是有效的,因为我看到无效的 class 在回发发生时应用了几秒钟。
我明白 $timeout
returns 是一个承诺,所以我尝试将 then 链接到 $timeout
上,如下所示:
return $timeout(function () {
var elementToCheckNotEmpty = $document[0].querySelector(attrs.omwNotEmpty);
if (!elementToCheckNotEmpty.value) {
scope.addInvalidClass = true;
}
}).then(function () {
if (scope.addInvalidClass) {
event.preventDefault();
event.stopPropagation();
return false;
}
});
但这也不能阻止回发。这是一个带有共享主页的 webforms 项目,所以我无法在不影响许多其他页面的情况下真正更新 form
元素。该表单确实有一个空的 action
属性。此外,ng-controller
属性位于 内部 元素 form
元素上,不确定这是否有所不同...
我做错了什么?我是 Angular 的新手,顺便说一句,如果这是微不足道的,我深表歉意!
使用 $timeout 将函数添加到异步队列,从而不会阻止回发。当不使用 $timeout 服务时绑定不会改变,因为点击不在 angular 摘要周期内。而不是 $timeout 将范围更改包含在 scope.$apply() 中,或者您可以只使用 ng-click 而不是 element.bind.