2014-12-31 26 views
5

Ho definito un servizio come questo:iniezione condizionale di un servizio in AngularJS

angular.module('myApp').service('myService', [ 
'$rootScope', 
... 
... 

io voglio che il mio servizio da un'istanza solo per i nuovi utenti (vale a dire quando user.createdAt> oggi).

Quindi c'è un modo per iniettare il mio servizio condizionatamente o almeno distruggere il mio servizio senza alcun effetto collaterale se l'utente è vecchio.

risposta

7

È possibile utilizzare il servizio $injector per ottenere iniettare-ibles dinamicamente se è necessario:

app.controller('DemoCtrl', function($injector) { 
    this.clicky = function() { 
    myFact = $injector.get('myFactory'); 
    myFact(); 
    }; 
}); 

app.factory('myFactory', function() { 
    return function() { 
    alert('foobar!'); 
    }; 
}); 

Ecco una demo completa: http://jsbin.com/bemakemaja/1/edit

E il $injector doc: https://docs.angularjs.org/api/auto/service/$injector

Come linea guida generale, sebbene raccomando di non progettare i propri servizi in modo tale che la semplice iniezione di questi abbia effetti collaterali.

0

uso factory invece di service, in modo che si può avere una logica il check-nel servizio

angular.module('myApp').factory('myService', function() { 

    if (newUser) { 
     return { // your service implementation here 
     } 
    } 
    return undefined; 
}; 
0

Quindi c'è un modo per iniettare il mio servizio in modo condizionato o almeno distruggere il mio servizio senza alcun effetto collaterale se l'utente è vecchio.

migliore per catturare questa logica all'interno del servizio:

class Service{ 
    static $inject = ['$rootScope']; 
    constructor($rootScope){ 
     if (user.createdAt > today){ /*something*/ } 
     else {/*other thing*/} 
    } 
} 

NOTA: i servizi sono single iniezione in modo condizionale non vede come una soluzione desiderabile. Per ulteriori informazioni su $ inject: https://www.youtube.com/watch?v=Yis8m3BdnEM

Problemi correlati