2016-08-01 5 views
1

Ich möchte eine Dienstprogrammklasse in Angular.js erstellen, die von mehreren Controllern verwendet werden kann.Klasse Utils in Angular.js

Bisher habe ich dies:

'use strict'; 
angular 
    .module('App') 
    .factory('AppUtils', AppUtils); 

function AppUtils() { 
    var vm = this; 

    vm.getPersonOf = getPersonOf; 

    function getPersonOf(personId, allPersons) { 
    var person = {}; 
    person.personId = {personId: personId}; 
    allPersons.forEach(function(p) { 
     if (p.personId === personId) { 
     person = p; 
     } 
    }); 
    return person; 
    } 

} 

Und ich versuchte es in einem Controller wie folgt zu verwenden:

'use strict'; 
angular 
    .module('App') 
    .controller('AppController', AppController); 

function AppController(personId, allPersons, AppUtils) { 

var vm = this; 
vm.personId = personId; 

vm.person = AppUtils.getPersonOf(vm.personId, allPersons); 

... 
} 

Aber ich bekomme diese:

PhantomJS 1.9.8 (Windows 7 0.0.0) App should dismiss modal FAILED Error: [$injector:undef] Provider 'AppUtils' must return a value from $get factory method. http://errors.angularjs.org/1.5.0/ $injector/undef?p0=InvoiceUnitsUtils

(Die echte Namen wurden umbenannt, um es einfacher zu machen.)

Warum bekomme ich diesen Fehler? Deklariere ich das Utility-Modul nicht ordnungsgemäß?

+0

, das nicht ist, wie man verwendet 'factory'. Was Sie tun, sollte ein "Service" sein – floribon

+0

Sie müssen nur am Ende der Fabrik 'vm;' zurückgeben. – daymosik

Antwort

1

Die Fabrik ist verantwortlich für die Erstellung eines Dienstes und die Übergabe der Instanz an Sie. Um dies zu tun, müssen Sie Ihre Utility-Klasse zurückzukehren:

function AppUtils() { 

    return { 
     getPersonOf: getPersonOf 
    // pass other utility functions... 
    } 

    function getPersonOf(personId, allPersons) { 
     var person = {}; 
     person.personId = {personId: personId}; 
     allPersons.forEach(function(p) { 
      if (p.personId === personId) { 
       person = p; 
      } 
     }); 
     return person; 
    } 
    } 

Ich entfernte den vm Teil, weil wir einen Dienst übergeben, die in der Regel kein View-Modell hat (die Steuerung verantwortlich für das heißt, ist der Service eher eine Business-Logik-Experte).

Hier einige weitere Informationen über die $get Funktion in Angular der Anbieter: https://docs.angularjs.org/guide/providers