2015-04-17 12 views
8

Sto utilizzando una fabbrica angolare per eseguire CRUD sulle mie classi su Parse.com. Ho un totale di 4 classi e ho bisogno di eseguire creare, ottenere, inserire, eliminare su tutto 4. Anche se l'URL è diverso per ognuno, tutto il resto rimane lo stesso. Posso passare variabili alla fabbrica per cambiare il nome della classe nell'URL API?Variabile angolare Variabili di fabbrica REST

Ecco un esempio di una fabbrica.

.factory('Programme',['$http','PARSE_CREDENTIALS',function($http,PARSE_CREDENTIALS){ 
    return { 
     getAll:function(){ 
      return $http.get('https://api.parse.com/1/classes/Programme',{ 
       headers:{ 
        'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID, 
        'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY, 
        'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION 
       } 
      }); 
     }, 
     get:function(id){ 
      return $http.get('https://api.parse.com/1/classes/Programme/'+id,{ 
       headers:{ 
        'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID, 
        'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY, 
        'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION 
       } 
      }); 
     }, 
     create:function(data){ 
      return $http.post('https://api.parse.com/1/classes/Programme',data,{ 
       headers:{ 
        'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID, 
        'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY, 
        'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION, 
        'Content-Type':'application/json' 
       } 
      }); 
     }, 
     edit:function(id,data){ 
      return $http.put('https://api.parse.com/1/classes/Programme/'+id,data,{ 
       headers:{ 
        'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID, 
        'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY, 
        'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION, 
        'Content-Type':'application/json' 
       } 
      }); 
     }, 
     delete:function(id){ 
      return $http.delete('https://api.parse.com/1/classes/Programme/'+id,{ 
       headers:{ 
        'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID, 
        'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY, 
        'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION, 
        'Content-Type':'application/json' 
       } 
      }); 
     } 
    } 
}]) 

Ovviamente questo x4 è un disastro.

Così ho bisogno di cambiare l'URL /Programmes-/Users/Prescription

io chiamo questo come dal mio controllo in questo modo:

Programme.edit($localStorage.programme.id, {exerciseData:exercises}).success(function(data){ 
}); 

In secondo luogo come io sono in grado di contrassegnare il gestore degli errori su questo funzione del controller come per l'SDK di Javascript?

+0

Onestamente, quando si inizia ad entrare nel territorio delle autorizzazioni si dovrebbe astratto nel blocco di configurazione o di esecuzione. – Swordfish0321

risposta

2

È questo che intendi?

È quindi possibile chiamare in questo modo:

Programme.provider('Prescription/').edit($localStorage.programme.id, {exerciseData:exercises}).success(function(data){ 
}).error(function(response){ ... }; 
+0

No not quite ... Ho bisogno di cambiare l'URL in modo che sia qualcosa come la mia domanda modificata. – Taylorsuk

+1

Vedere la risposta modificata per riflettere il commento. –

+0

Questo account per ''Content-Type': 'application/json'' Questa risposta mi piace molto. Lo implementerò e lo contrassegnerò come corretto quando sono attivo e in esecuzione – Taylorsuk

5

1) Utilizzare un intercettore per ripulire il codice URL: Inserire il seguente nella vostra app.js

$httpProvider.interceptors.push(function ($q) { 
    return { 
    request: function(config) { 
     if (config.url.split('/')[0] === 'api'){ 
     config.url = 'http://yourserverurl:3000/' + config.url.replace('api/', ''); 
     } 
     return config || $q.when(config); 
    } 
    }; 
}); 

2) Nelle tue richieste di url, puoi ora modificarle con una semplice chiamata a api/class, e puoi fornire il classname come parametro per riutilizzare la stessa funzione. Esempio:

create:function(classname, data){ 
     return $http.post('api/' + classname, data, { 
      headers:{ 
       'X-Parse-Application-Id': PARSE_CREDENTIALS.APP_ID, 
       'X-Parse-REST-API-Key':PARSE_CREDENTIALS.REST_API_KEY, 
       'X-Parse-Session-Token': PARSE_CREDENTIALS.PARSE_SESSION, 
       'Content-Type':'application/json' 
      } 
     }); 
    }, 

3) Per la movimentazione su una promessa errore, basta usare .error (errFunc) Esempio:

Programme.edit($localStorage.programme.id, { exerciseData:exercises }).success(function(data){ 
}).error(function(response){ ... }; 

ps Per 1 e 2, assicuratevi di aggiungere $ httpProvider al tuo .config in app.js

0

Penso che questo dovrebbe essere fatto usando le risorse e anche estraendo servizi specifici per gli oggetti, non solo rimuovendo tutto in una grande fabbrica, è cattiva abitudine e forma.

Crea un servizio separato per ciascuno dei tuoi oggetti ... inoltre dovresti usare le promesse che condurrà per un codice migliore. Ricorda che molte delle esercitazioni che leggi/copi sono allo scopo di spiegare la tecnologia che non crea un'applicazione di produzione.

Definizione di un servizio per un oggetto specifico utilizzando ng-resource

/** 
* this factory wraps the use of angular-resource for interacting with the Kinvey 
* models we have created. 
* The factory also introduces the use of promises to handle the asynchronous http 
* requests. 
* 
* @see doc - https://docs.angularjs.org/api/ngResource/service/$resource 
* @see doc - $q - promises in angular - https://docs.angularjs.org/api/ng/service/$q 
*/ 
    .factory('MemberService', ['$resource', 'KINVEY', function ($resource, KINVEY) { 

     /** 
     */ 
     function genericErrorHandler(_error) { 
      console.log(_error.data); 
      $scope.response = _error.data; 
     } 

     var reqHeaders = { 
      'Authorization': KINVEY.auth 
     }; 

     var Member = $resource(KINVEY.baseUrl + "members/:_id", {}, 
      { 
       // headers are passed in as javascript name/value pairs 
       'query': { 
        headers: reqHeaders, 
        isArray: true 
       }, 
       'save': { 
        method: 'POST', 
        headers: reqHeaders 
       }, 
       'get': { 
        headers: reqHeaders 
       }, 
       'update': { 
        method: 'PUT', 
        params: {_id: "@_id"}, 
        headers: reqHeaders 
       }, 
       'remove': { 
        method: 'DELETE', 
        headers: reqHeaders 
       } 
      }); 

     return Member; 
    }]); 

utilizzando il Servizio

/** 
* 
* @param $scope 
*/ 
$scope.doList = function() { 
    // specific helper classes for the HTTP VERBS 
    MemberService.query() 
     .$promise.then(function (_response) { 
      $scope.response = _response; 
     }).catch(genericErrorHandler); 
}; 

Mostra tutto l'esempio https://github.com/aaronksaunders/angular-kinvey-dataservices-example

Problemi correlati