2015-04-17 22 views
8

Używam kątowej fabryki do wykonywania CRUD na moich zajęciach na Parse.com. Mam w sumie 4 klasy i muszę wykonać tworzenie, pobieranie, umieszczanie, usuwanie na wszystkich 4. Chociaż adres URL jest inny dla każdego, wszystko inne pozostaje takie samo. Czy mogę przekazać zmienne do fabryki, aby zmienić nazwę klasy w adresie URL api?Zmienne fabryczne REST parametrów kątowych

Oto przykład jednej fabryki.

.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' 
       } 
      }); 
     } 
    } 
}]) 

Oczywiście to x4 to bałagan.

Więc muszę zmienić adres URL z /Programmes do /Users/Prescription

Wołam to jak z mojego kontrolera tak:

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

Po drugie, jak jestem w stanie oznaczyć obsługi błędu na ten funkcja kontrolera zgodnie z pakietem JavaScript SDK?

+0

Szczerze mówiąc, kiedy zaczynają się na terytorium Uprawnienia powinny streszczenie to do bloku konfiguracji lub uruchomienia. – Swordfish0321

Odpowiedz

2

Czy to masz na myśli?

Następnie można nazwać tak:

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

Nie, nie ... Potrzebuję zmienić adres URL, więc jest to coś w rodzaju edytowanego przeze mnie pytania. – Taylorsuk

+1

Zobacz edytowaną odpowiedź, aby odzwierciedlić komentarz. –

+0

Czy to konto '' Content-Type ':' application/json'' Bardzo lubię tę odpowiedź. Zaimplementuję go i oznaczy jako poprawny, gdy jestem uruchomiony. – Taylorsuk

5

1) Użyj przechwytywania, aby oczyścić swój kod URL: Umieść następujące w swoim 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) W żądaniach URL możesz teraz modyfikować je za pomocą prostego wywołania api/class, a możesz podać nazwę klasy jako parametr do ponownego użycia tej samej funkcji. Przykład:

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) przy obchodzeniu się z obietnicy błędu, wystarczy użyć .error (errfunc) Przykład:

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

ps na 1 i 2, upewnij się, dodaje $ httpProvider do pliku .config w app.js

0

Myślę, że powinno się to zrobić za pomocą zasobów, a także wydzielić konkretne usługi dla was, nie tylko po prostu w jednej wielkiej fabryce jest to zły nawyk i forma.

Utwórz oddzielną usługę dla każdego z obiektów ... również powinieneś użyć obietnic, które doprowadzą do lepszego kodu. Pamiętaj, że wiele tutoriali, które czytasz/kopiujesz, ma na celu wyjaśnienie, że technologia nie buduje aplikacji produkcyjnej.

Definiowanie usługi dla określonego obiektu przy użyciu 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; 
    }]); 

Właściwie korzystania z usługi

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

Zobacz pełny przykład https://github.com/aaronksaunders/angular-kinvey-dataservices-example

Powiązane problemy