2015-08-20 120 views
0

我有runat="server"锚点__doPostBackhref防止从角度指令回发

我想验证单击锚点时已经完成了另一个字段,并且只允许在该字段不为空时发生回发。

我添加了一个自定义的指令处理这个问题,主要内容如下:

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返回一个承诺,这就是我一直一个链接然后到$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 btw很陌生!

+0

为什么你需要使用$超时? – Bharat

+0

没有它,我想要不是空的元素的ng类绑定似乎不起作用。我在范围*上更改的属性被更改,但绑定不会添加该类。但是,它**会阻止回发 – danwellman

+0

绑定不会更改,因为点击不在角度摘要周期内。而不是$ timeout将作用域更改用范围括起来$ apply()或者你可以用ng-click来代替element.bind。 – Bharat

回答

1

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