防止Angular指令回发

时间:2015-08-20 10:39:14

标签: angularjs angularjs-directive webforms

我在runat="server"中有一个__doPostBack锚点href

我希望在单击锚点时验证另一个字段已完成,并且只有在字段不为空时才允许回发。

我已经添加了一个自定义指令来处理这个问题,如下所示:

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属性并将类添加到输入中是有效的,因为我看到在回发发生时应用了几秒钟的无效类。

我理解$timeout会返回一个承诺,所以我尝试将{a> $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; } }); ,如此:

form

但这并不妨碍回发。它是一个带有共享母版页的webforms项目,因此我无法真正更新action元素而不会影响很多其他页面。该表单具有空ng-controller属性。此外,form属性位于内部 If statement元素的元素上,不确定这是否会产生影响......

我做错了什么?我对Angular btw很新,所以如果这是微不足道的话,请道歉!

1 个答案:

答案 0 :(得分:1)

使用$ timeout将函数添加到异步队列,从而不会阻止回发。并且当不使用$ timeout服务时绑定不会改变,因为click不在角度摘要周期内。而不是$ timeout将范围更改与范围括起来。$ apply()或者您可以使用ng-click而不是element.bind。