1

我正在研究以下验证指令,在这个答案中向我建议:

MyBigAngularApp.directive("bkNgValidation", function ($compile) {
    return {
        priority: 10000,
        terminal: true,
        link: function (scope, element, attrs) {

            var validationType = attrs.bkNgValidation;
            window["addValidationFor_" + validationType](element);

            // prevent infinite loop
            element.removeAttr("bk-ng-validation");
            $compile(element)(scope);
        }
    };
});

然后,当我将此指令应用于 html 元素时,以 形式bk-ng-validation="phoneNumber",我的指令调用此函数:

function addValidationFor_phoneNumber(element) {
    element.attr("ng-pattern", "/^[0-9]+$/");
    element.attr("ng-minlength", 5);
    element.attr("ng-maxlength", 8);
    alert("yeah baby");
}

addValidationFor_phoneNumber目前在全局命名空间中,只是为了我的概念证明,但我希望使用一个显示模块来组织可能成为相当多的验证功能的东西。还是因为我在 Angular 内部工作,所以我应该遵循其他一些模式?我怀疑我可以做一些事情,比如为显示模块声明一个常量并将其注入指令中,但我想我会在走错路之前问这个问题。

4

1 回答 1

0

实际上,通常不建议在 Javascript 中使用全局范围内的变量,并且在使用 AngularJS 时绝对是反模式。

您正在寻找的是一个service(或factory,它以稍微不同的语法完成相同的工作),它将被注入到您的指令中。

MyBigAngularApp.service('bkService', function() {
  this.phoneNumber   = function(element) { ... }
  this.somethingElse = function(element) { ... }
});

你的指令变成:

// Note how bkService is injected to the directive in this first line
MyBigAngularApp.directive("bkNgValidation", function ($compile, bkService) {
  return {
    priority: 10000,
    terminal: true,
    link: function (scope, element, attrs) {

        var validationType = attrs.bkNgValidation;
        bkService[validationType](element);

        // prevent infinite loop
        element.removeAttr("bk-ng-validation");
        $compile(element)(scope);
    }
  };
});

现在,如果将使用此服务的唯一指令是该指令,您实际上不需要创建服务,而是可以简单地将所有这些函数包装为来自 bkNgValidation 的私有方法:

MyBigAngularApp.directive("bkNgValidation", function ($compile) {

  var validations = {
    phoneNumber:   function(element) { ... }
    somethingElse: function(element) { ... }
  };

  return {
    priority: 10000,
    terminal: true,
    link: function (scope, element, attrs) {

        var validationType = attrs.bkNgValidation;
        validations[validationType](element);

        // prevent infinite loop
        element.removeAttr("bk-ng-validation");
        $compile(element)(scope);
    }
  };
});
于 2015-05-13T22:13:12.650 回答