2015-05-13 1 views
1

Я работаю на директивы проверки ниже, предложил мне в this answer:Как я должен упаковать функции плагина для использования в директиве проверки?

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? Я подозреваю, что могу сделать что-то вроде объявления константы для раскрывающего модуля и ввести его в директиву, но я думал, что задаю этот вопрос, прежде чем идти слишком далеко по неправильной дороге.

ответ

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); 
    } 
    }; 
}); 
+0

Спасибо, отличный ответ для noob (меня, а не вы). Мне очень нравится идея сервиса, чтобы разделить проблемы связывания элемента с функцией, то есть директивы, и выполнения этой функции, то есть службы, но только сейчас, только один раз, я собираюсь использовать подход частных методов, чтобы ограничить мой набег в угловое пространство. – ProfK

+0

Yep-сервисы становятся действительно полезными, как только вам нужно как минимум делиться информацией между двумя директивами. Но тогда, если у них есть сильная иерархия (т. Е. Dir2 всегда внутри dir1), некоторые предпочтительные методы привязки или наследования, вы можете столкнуться с этими случаями позже, если будете продолжать использовать эту замечательную структуру :) – floribon