2013-04-26 15 views
37

Sto cercando di capire il concetto di fabbrica e servizio in Angular. Ho il seguente codice sotto il controller

init(); 

    function init(){ 
     $http.post('/services', { 
      type : 'getSource', 
      ID : 'TP001' 
     }). 
     success(function(data, status) { 
      updateData(data); 
     }). 
     error(function(data, status) { 

     }); 

     console.log(contentVariable); 
    }; 
    function updateData(data){ 
     console.log(data); 
    }; 

Questo codice funziona correttamente. Ma quando sposto il servizio $ http in fabbrica, non sono in grado di restituire i dati al controller.

studentApp.factory('studentSessionFactory', function($http){ 
    var factory = {}; 
    factory.getSessions = function(){ 
     $http.post('/services', { 
      type : 'getSource', 
      ID : 'TP001' 
     }). 
     success(function(data, status) { 
      return data; 
     }). 
     error(function(data, status) { 

     }); 
    }; 
    return factory; 
}); 

studentApp.controller('studentMenu',function($scope, studentSessionFactory){ 
    $scope.variableName = []; 
    init(); 
    function init(){ 
     $scope.variableName = studentSessionFactory.getSessions(); 
     console.log($scope.variableName); 
    }; 
}); 

non v'è alcun vantaggio di utilizzare in fabbrica, dal momento che $ http funziona anche sotto controllo

risposta

88

Lo scopo di spostare il servizio di studentSessions fuori del vostro controllo è quello di raggiungere la separazione degli interessi. Il lavoro del tuo servizio è sapere come parlare con il server e il lavoro del controllore è tradurre tra dati di visualizzazione e dati del server.

Ma si confondono i gestori asincroni e cosa restituisce cosa. Il controller ha ancora bisogno di dire al servizio di cosa fare quando i dati vengono ricevuti dopo ...

studentApp.factory('studentSession', function($http){ 
    return { 
     getSessions: function() { 
      return $http.post('/services', { 
       type : 'getSource', 
       ID : 'TP001' 
      }); 
     } 
    }; 
}); 

studentApp.controller('studentMenu',function($scope, studentSession){ 
    $scope.variableName = []; 

    var handleSuccess = function(data, status) { 
     $scope.variableName = data; 
     console.log($scope.variableName); 
    }; 

    studentSession.getSessions().success(handleSuccess); 
}); 
+1

Grazie Brian. Ha senso ora. Ottengo un errore 'mancante} errore dopo l'elenco delle proprietà'. L'errore persiste dopo la chiusura, aggiungendo una parente stretta per il ritorno in fabbrica. –

+0

Oki ha riparato la parte della parastesi. Ora il codice è 'studentApp.factory ('studentSession', function ($ http) { return { getSessions: function() { return $ http.post ('/ services', { type: 'getSource', ID: 'TP001' }); } } }); 'Ora viene visualizzato un errore che indica che" Errore b non è una funzione ". Non ho alcuna funzione chiamata b. Qualche suggerimento su cosa fa scattare questo errore? –

+0

Grazie. Ho perso quella coppia. Per quanto riguarda "b non è una funzione", stai usando una sorta di minification o ugificazione del codice? –

8

La prima risposta è grande, ma forse si può capire questo:

studentApp.factory('studentSessionFactory', function($http){ 
    var factory = {}; 

    factory.getSessions = function(){ 
     return $http.post('/services', {type :'getSource',ID :'TP001'}); 
    }; 

    return factory; 
}); 

Poi:

studentApp.controller('studentMenu',function($scope, studentSessionFactory){ 
     $scope.variableName = []; 

     init(); 

     function init(){ 
      studentSessionFactory.getSessions().success(function(data, status){ 
       $scope.variableName = data; 
      }); 
      console.log($scope.variableName); 
    }; 
}); 
+0

Sembra una buona risposta, ma ".success" ora è stato deprecato sembra http://stackoverflow.com/questions/33531336/angularjs-error-successo-is-not-a-funzione di # 33.531.521. – SharpC

Problemi correlati