javascript - 我可以在自定义指令中以编程方式应用 Angular 验证指令吗?

标签 javascript angularjs

我发现很多 html 输入都出现以下模式,这是电话号码:

<input type="text" ng-model="CellPhoneNumber" required ng-pattern="/^[0-9]+$/" ng-minlength="10" />

我想创建一个自定义指令,无论在何处应用,它都会告诉 Angular 应用所有这三个规则,例如:

<input type="text" ng-model="CellPhoneNumber" bk-ng-validation="phoneNumber"/>

然后,我的指令中的代码会找到并调用一个名为 phoneNumber 的函数,我希望在其中看到如下内容:

list 1:

function bkNgPhoneNumber(model) {
    // This is purely SPECULATIVE pseudo-code, just to convey an idea.
    model.errors.add(applyMinLength(10, model));
    model.errors.add(applyMaxLength(15, model));
    model.errors.add(applyPattern("/^[0-9]+$/", model));
}

与“为这些规则重写代码”相比,我更喜欢上述方法,例如:

list 2:

function phoneNumber(model) {
    if (model.length < 10 || model.length > 15) {
        model.errors.add("Must be 10 to 15 chars!");
    }
}

我不想取消所有基于属性的指令,但最好创建一个“宏”指令来调用我的 list 1 代码,该代码将内部调用一组更多的“微”验证。

最佳答案

执行此操作的一种方法(即应用现有验证器而无需再次编写代码)是添加验证指令的相应属性并强制重新编译。这将要求您的指令具有足够高的优先级并且也是 terminal: true

app.directive("bkNgValidation", function($compile){
  return {
    priority: 10000,
    terminal: true,
    link: function(scope, element){
      element.attr("ng-required", "true");
      element.attr("ng-minlength", 20);
      element.attr("ng-maxlength", 30);

      // prevent infinite loop
      element.removeAttr("bk-ng-validation");

      $compile(element)(scope);
    }
  };
});

Demo

关于javascript - 我可以在自定义指令中以编程方式应用 Angular 验证指令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30149924/

相关文章:

javascript - 在 IE 中解析 A​​jax 加载的 HTML 内容

javascript - 使用元素的高度更改页面滚动菜单的CSS

ruby-on-rails - 无法让设计从 Angular.js 注销

javascript - 如何调用函数来渲染 `ng-repeat` 指令中的项目?

javascript - JS 中的数组排序

javascript - 如何制作每10秒刷新一次的jquery表?

angularjs - 使用 AngularJS 在 Session 中存储数据

ruby-on-rails - 将Angularjs和Rails应用程序分离为独立组件

javascript - 页面刷新后如何从 POST 中保留变量?

javascript - 如何用css制作双悬停效果