2017-05-22 2 views
0

Ich versuche $ translate.proposedLanguage() in einer AngularJS Komponente zu verwenden, die mir die intl-tel-Eingabe-Plugin initialisieren und konfigurieren:

function customTel() { 
return { 
    restrict: 'A', // restrict as Attr 
    require: 'ngModel', // require ngModel from html 
    scope: {}, 
    link: function($scope, $elem, $attrs, $ctrl) { 

     var ngModelCtrl = $ctrl; // access to ngModel with $ctrl 

     var lenguaje = $translate.proposedLanguage() || $translate.use(); 

     if (lenguaje === "es") { 
      lenguaje = "ES"; 
     } else if (lenguaje === "en") { 
      lenguaje = "GB"; 
     } else if (lenguaje === "pt-pt") { 
      lenguaje = "PT" 
     } 

     $elem.intlTelInput({ 
      initialCountry: lenguaje, 
      preferredCountries: ["ES", "GB", "PT", "US"], 
      nationalMode: true, 

      utilsScript: "../../webclientes/bower_components/intl-tel-input/build/js/utils.js" 
     }); 

    } 
} 
} 

    angular 
     .module('webclientesApp') 
     .directive('customTel', customTel); 

Das Problem, dass $ ist die Sprache nicht definiert ist, auch wenn ich es in der Steuerung zu injizieren:

(function() { 
    'use strict'; 

    angular 
     .module('webclientesApp') 
     .controller('ContactaController', ContactaController); 

    ContactaController.$inject = ['$scope', 'Principal', 'ContactaServiceRest', '$state', '$translate']; 

    function ContactaController ($scope, Principal, ContactaServiceRest, $state, $translate) { 

... 

ich habe versucht, es in den Verbindungsparametern zu injizieren, oder in den .directive unten, aber nichts hat bisher funktioniert.

Wie kann ich über die Komponente auf $ translate zugreifen? Vielen Dank!

+0

Ändern Sie 'function customTel()' in 'Funktion customTel ($ translate)'. Sehen Sie [diese Frage] (http://stackoverflow.com/questions/15569168/injecting-service-to-directive) für weitere Informationen – George

+0

Danke für die Hilfe, @george. Ich habe es einfach ausprobiert und diesen Fehler bekommen. Fehler: [$ injector: strictdi] customTel verwendet keine explizite Anmerkung und kann nicht im strikten Modus aufgerufen werden. Irgendeine Idee warum passiert das? Ich überprüfe die Antwort, die Sie zur Verfügung gestellt haben, gibt aber keine Informationen zu diesem Fehler :( – wickedchild

Antwort

2

Wenn Sie Ihren Code, um diese Änderung sollte es funktionieren:

angular 
.module('webclientesApp') 
.directive('customTel', customTel); 

customTel.$inject = ['$translate']; 

function customTel($translate) { 
    return { 
     restrict: 'A', // restrict as Attr 
     require: 'ngModel', // require ngModel from html 
     scope: {}, 
     link: function ($scope, $elem, $attrs, $ctrl) { 

      var ngModelCtrl = $ctrl; // access to ngModel with $ctrl 

      var lenguaje = $translate.proposedLanguage() || $translate.use(); 

      if (lenguaje === "es") { 
       lenguaje = "ES"; 
      } else if (lenguaje === "en") { 
       lenguaje = "GB"; 
      } else if (lenguaje === "pt-pt") { 
       lenguaje = "PT" 
      } 

      $elem.intlTelInput({ 
       initialCountry: lenguaje, 
       preferredCountries: ["ES", "GB", "PT", "US"], 
       nationalMode: true, 

       utilsScript: "../../webclientes/bower_components/intl-tel-input/build/js/utils.js" 
      }); 

     } 
    } 
} 

Sie benötigen Abhängigkeiten in der Richtlinie Funktion und nicht in der Link-Funktion zu injizieren. Der Grund, warum Sie den Injektionsfehler erhalten, liegt auch an einer Einstellung, die Sie im Winkel see the documentation aktivieren können. Es ist auf jeden Fall besser, da die Dateien dadurch verkleinert werden können.

+0

Spot on! :) Ich bin ziemlich neu im AngularJS-Universum, und ich habe immer noch Schwierigkeiten zu verstehen, wie es funktioniert. Vielen Dank George :))) – wickedchild

+1

@wickedchild wir beginnen alle irgendwo, ich würde empfehlen [John Papas Style Guide] (https://github.com/johnpapa/angular-styleguide/blob/master/a1/README. md) ein lesen. – George