gpt4 book ai didi

AngularJS指令: ng-click is not triggered after blur

转载 作者:行者123 更新时间:2023-12-02 19:14:02 26 4
gpt4 key购买 nike

DEMO

考虑以下示例:

<input type="text" ng-model="client.phoneNumber" phone-number>
<button ng-click="doSomething()">Do Something</button>
.directive("phoneNumber", function($compile) {
return {
restrict: 'A',
scope: true,
link: function(scope, element, attrs) {
scope.mobileNumberIsValid = true;

var errorTemplate = "<span ng-show='!mobileNumberIsValid'>Error</span>";

element.after($compile(errorTemplate)(scope)).on('blur', function() {
scope.$apply(function() {
scope.mobileNumberIsValid = /^\d*$/.test(element.val());
});
});
}
};
});

查看demo ,如果您在电话号码末尾添加“a”,然后单击按钮,则不会调用 doSomething()。如果再次单击该按钮,则会调用 doSomething()

为什么第一次不调用doSomething()?有什么想法可以解决这个问题吗?

注意:保持验证模糊非常重要。

最佳答案

解释

  1. 使用点击按钮,在按钮元素上触发mousedown事件。
  2. 输入处于模糊状态,触发模糊回调以验证输入值。
  3. 如果无效,则显示错误范围,按下按钮标签,从而将光标移至左侧按钮区域。如果用户释放鼠标,则不会触发 mouseup 事件。这就像单击按钮一样,但在释放鼠标之前移出按钮以取消按钮单击。这就是 ng-click 未触发的原因。因为按钮上没有触发 mouseup 事件。

解决方案

使用ng-pattern动态验证输入值,并根据ngModel.$invalid属性立即显示/隐藏错误范围。

演示 1 http://jsbin.com/epEBECAy/14/edit

-----更新1-----

根据作者的要求,用另一种解决方案更新了答案。

演示 2 http://jsbin.com/epEBECAy/21/edit?html,js

HTML

<body ng-app="Demo" ng-controller="DemoCtrl as demoCtrl">
<pre>{{ client | json }}</pre>
<div id="wrapper">
<input type="text" phone-number
ng-model="client.phoneNumber"
ng-blur="demoCtrl.validateInput(client.phoneNumber)">
</div>
<button ng-mousedown="demoCtrl.pauseValidation()"
ng-mouseup="demoCtrl.resumeValidation()"
ng-click="doSomething()">Do Something</button>
</body>

逻辑

我在输入上使用了 ng-blur 指令来触发验证。如果在 ng-blur 之前触发 ng-mousedown,则 ng-blur 回调将推迟到 ng-mouseup被解雇了。这是通过利用 $q 服务来完成的。

关于AngularJS指令: ng-click is not triggered after blur,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21084932/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com