2012-09-18 12 views
34

Moim zdaniem, chcę render:Gdzie umieścić funkcje zdefiniowane przez użytkownika w Angular JS?

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

Gdzie say jest zdefiniowany jako takie:

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

mogę zdefiniować go w moim kontrolera:

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

Ale to jest to dostępne tylko w tym kontrolerze.

Jeśli zdefiniuję tę funkcję poza strukturą pliku kątowego, to nic nie wyrenderuje. To samo, jeśli definiuję je w pliku controllers.js, ale poza zakresem funkcji kontrolera.

Gdzie jest właściwe miejsce na umieszczenie mojej funkcji, więc mogę renderować ją w dowolnym kontrolerze?

Odpowiedz

48

Jednym ze sposobów jest create a service z funkcjami, które chcesz udostępnić w wielu kontrolerach. Aby uzyskać więcej informacji, patrz this post.

Po to zrobić można wstrzykiwać utworzony w dowolnym kontrolerem usługi i dostęp do funkcji say() z kodem coś takiego:

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

Gdzie zdefiniowane myService jak:

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

Tutaj jest jsFiddle z przykładem.

+0

Awesome ... Spodziewałem się, że będzie to możliwe z usługami, ale nie mogłem znaleźć składni, aby je dodać w –

+5

Po prostu FYI, alternatywna składnia (wolę widzieć/czytać "usługę" zamiast "fabryki" jeśli potrzebuję tylko funkcji konstruktora): .service ('myService', function() { this.say = function() {return "Hello World";} }); –

+1

"Problem" z odpowiednią usługą polega na tym, że za każdym razem, gdy używasz usługi, otrzymujesz nową instancję tej usługi. W takim przypadku może to nie być najlepszy pomysł. – Spock

Powiązane problemy