2012-09-18 17 views
34

Aus meiner Sicht möchte ich machen:Wohin mit benutzerdefinierten Funktionen in Angular JS?

<p> 
    {{ say() }} 
</p> 

Wo say als solche definiert:

say = function() { 
    return "Hello World"; 
} 

ich es in meinem Controller definieren:

function TestCtrl($scope) { 
    $scope.say = function() { ... }; 
} 

es ist aber dann nur innerhalb dieses Controllers zugänglich.

Wenn ich die Funktion außerhalb der Angular-Dateistruktur definiere, gibt sie nichts aus. Gleiches, wenn ich es in meiner Datei definiere, aber außerhalb eines Kontrollerfunktionsbereichs.

Wo ist der richtige Ort, um meine Funktion zu platzieren, damit ich es in jedem Controller rendern kann?

Antwort

48

Ein Weg ist create a service mit den Funktionen, die Sie über mehrere Controller freigeben möchten. Weitere Informationen finden Sie unter this post.

Nachdem Sie dies tun, können Sie den Dienst injizieren Sie in jedem Controller erstellt und Zugriff auf die say() Funktion mit Code etwas wie folgt aus:

function TestCtrl($scope, myService){ 
    $scope.say = myService.say; 
} 

Wo Sie definiert myService als:

angular.module('myApp', []) 
    .factory('myService', function() { 
     return { 
      say: function() { 
       return "Hello World"; 
      } 
     } 
    }); 

Hier ist ein jsFiddle mit einem Beispiel.

+0

Ehrfürchtig ... Ich hatte erwartet, dass es in den Diensten ist, aber konnte die Syntax nicht finden, um es in –

+5

hinzuzufügen Just FYI, eine alternative Syntax (ich bevorzuge 'Service' statt 'Factory' zu sehen/lesen wenn ich nur eine Konstruktorfunktion brauche): .service ('myService', function() { this.say = function() {return "Hallo Welt";} }); –

+1

Das "Problem" bei einem ordnungsgemäßen Service besteht darin, dass Sie bei jeder Nutzung des Service eine neue Instanz dieses Service erhalten. In diesem Fall ist es vielleicht nicht die beste Idee. – Spock