|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
get status rest angularjs
services.factory('UsersFactory', function ($resource) {
return $resource('url/users', {}, { query: { method: 'GET', isArray: true } }) }); app.controller('UserCreationCtrl', ['$scope', 'UsersFactory', '$location', function ($scope, UsersFactory, $location) { $scope.createNewUser = function () { UsersFactory.create($scope.user); } }]); Tramite un servizio rest mi scarico la lista di utenti in formato json e la stampo a video. Vorrei sapere come posso recuperare lo status di risposta della richiesta per sapere se è andata a buon fine o meno. Ho creato un json con campo stato (0 o 1) e descrizione. Grazie |
![]() |
![]() |
![]() |
#2 |
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
Secondo me $resource introduce piu' difficolta' che altro, con $http hai una Promise e quindi e' facilissimo:
Codice:
$http.get('url').then(function (response) { // OK, i dati sono in response.data }).catch(function () { // errore }); |
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
Inoltre ti consiglio di eliminare il campo di status dal formato JSON, e' un antipattern. Se il server deve restituire un errore faglielo restituire tramite HTTP status, altrimenti restituisci direttamente i dati JSON.
Tieni presente che un file JSON non deve necessariamente essere un oggetto. Array, numeri, stringhe, e altri valori semplici sono di per se' valori JSON validi. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
quindi in pratica come dovrei modificare il mio service senza stravolgere il codice?
per il codice di errore non ho capito bene come fare, io dovrei caricare una tabella con il json ricevuto, se c'è un errore avrei pensato di lanciare un alert con l'errore... |
![]() |
![]() |
![]() |
#5 | ||
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
Quote:
![]() Quote:
Codice:
$http.get('url').then(function (response) { // OK, i dati sono in response.data }).catch(function (response) { alert(response.statusText); }); |
||
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
ok, volendo testare $http sulla get, ovvero il servizio che mi scarica i dati per popolare la tabella html, cambio da cosi':
(mi sto basando su un esempio preso in rete funzionante) file controller.js app.controller('UserListCtrl', ['$scope', 'UsersFactory', '$location', function ($scope, UsersFactory, $location) { $scope.users = UsersFactory.query(); //chiama nel service.js il return $resource }]); in: app.controller('UserListCtrl', ['$scope', 'UsersFactory', '$location', function ($scope, UsersFactory, $location, $http) { $scope.users = function(){ $http.get('url').then(function (response) { return response.data; //mi aspetto che nello scope users avrò il json su cui applicare ng-repeat per popolare la tabella }).catch(function (response) { alert(response.statusText); }); }]); ho provato a cambiare in questo modo, ma la tabella non si carica con i dati e dalla console del browser non vedo errori. Dove sbaglio? |
![]() |
![]() |
![]() |
#7 |
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
Prova così:
Codice:
app.controller('UserListCtrl', function ($scope, $http) { $http.get('url').then(function (response) { $scope.users = response.data; }).catch(function (response) { alert(response.statusText); }); }); Una nota interessante: ciò che da (presumo) inesperto hai cercato di fare, ossia assegnare una Promise a un campo dello scope, non è del tutto aberrato, ma ha un suo senso. Le promise sono ancora una tecnologia giovane, ma in EcmaScript 7 sarà possibile fare cose di questo genere: Codice:
app.controller('UserListCtrl', function ($scope, $http) { try { $scope.users = (await $http.get('url')).data; } catch (response) { alert(response.statusText); } }); |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
in app.controller però in realtà ho anche altre funzioni, tipo questa:
// callback for ng-click 'createUser': $scope.createNewUser = function () { $location.path('/user-creation'); }; in questo codice come l'aggiungo? app.controller('UserListCtrl', function ($scope, $http) { $http.get('url').then(function (response) { $scope.users = response.data; }).catch(function (response) { alert(response.statusText); }); }); devo per forza creare $scope.users = function(){ no? |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
ho risolto, il problema era l'url:
$scope.utenti = function(){ $http({ method: 'GET', url: 'url' }).then(function successCallback(response) { $scope.lista = response.data; }, function errorCallback(response) { //alert("errore"); //alert(response.status); alert(JSON.stringify(response, null, 4)); }) //$scope.lista =MacrosFactory.query(); }; $scope.utenti(); //viene lanciata per caricare la fx ok, adesso ho alcuni dubbi: 1) e se volessi passare un parametro nell'url, per generare una get filtrata? ho aggiunto un textbox con pulsante, come posso passarlo alla funzione per accodarlo all'url? 2)nella errorCallback e nella successCallback vorrei visualizzare un alert carino tipo bootstrap alert success e danger, come posso fare? dovrei innescare un div e poi nasconderlo? |
![]() |
![]() |
![]() |
#10 | ||
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
No, anzi, non devi crearla. Non insozzare lo scope con elementi che non usi nel markup. Lo scope serve solo a rendere degli elementi visibili alle espressioni interpolate nel markup.
Questo: Codice:
$http({ method: 'GET', url: 'url', }) Codice:
$http.get('url') Quote:
Cosa ti impedisce di fare ad esempio cosi': Codice:
$http.get('users/' + id) Quote:
Qui ci sono gli esempi di come usare le modals: https://angular-ui.github.io/bootstrap/#/modal E qui gli alert: https://angular-ui.github.io/bootstrap/#/alert |
||
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
si ma +id non posso metterlo a mano, volevo sapere come passarglielo a partire dalla form html della pagina...
|
![]() |
![]() |
![]() |
#12 | |
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
Quote:
|
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
umm non so come fare perchè la tabella viene caricata dalla:
$scope.utenti(); (vedi sopra) quando viene lanciato il controller. poi nella pagina html carico la tabella con ng-repeat su utenti per fare come dici dovrei passare un parametro alla fx utenti(codice) ma poi non so come lanciarlo :s |
![]() |
![]() |
![]() |
#14 |
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
Markup:
Codice:
<form> <input type="text" ng-model="id"/> <button ng-click="update()">Aggiorna</button> </form> <div ng-repeat="user in users track by $index">{{user}}</div> Controller: Codice:
app.controller('UserListController', function ($scope, $http) { $scope.update = function () { delete $scope.users; $http.get('users/' + id).then(function (response) { $scope.users = response.data; }); }; }); |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
ok grazie
![]() ancora un altro dubbio, ho messo un pulsantino vicino ogni riga della tabella che al click mi apre una pagina per update della riga. La pagina viene cambiata con $routeprovider, ma vorrei che i campi della tabella(3) vengano popolati nella finestra di edit. Come posso riempire i 3 inputbox con i campi della riga selezionata? Ho pensato che cambiando pagina perdo lo scope è vero? Forse devo creare le modali? |
![]() |
![]() |
![]() |
#16 |
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
Il router di Angular cambia l'URL ma non la pagina. Le app in AngularJS sono a pagina singola. Non so come stai implementando il tutto ma non dovresti perdere lo scope.
Mettere l'interfaccia di modifica in una modal di AngularUI e' una cosa che puoi sicuramente fare e non escluse l'uso del router, cioe' puoi fare in modo che il router associ un URL alla modal. Piccola correzione riguardo al markup del mio post precedente: per gestire il click del bottone ho usato ng-click su un elemento <button>, ma in realta' e' molto meglio usare ng-submit sulla form, cosi': Codice:
<form ng-submit="update()"> <input type="text" ng-model="id"/> <input type="submit" value="Aggiorna"/> </form> |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
si infatti al centro della pagina principale apro la griglia con la tabella, poi cliccando sul pulsante della riga, apro al posto della pagina con la griglia, la pagina di updata.
adesso come faccio a popolare i capi tipo : <input type="text" style="min-width: 100%" class="form-control" id="inputCodice" placeholder="Inserisci il codice (Obbligatorio)" ng-model="macro.macro_entity_code"/> con il codice della righa che ho cliccato? e il riferimento alla specifica riga come lo prendo? |
![]() |
![]() |
![]() |
#18 |
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
Il metodo open delle modal (vedi documentazione) ti permette di specificare un oggetto di opzioni e tra le varie opzioni e' possibile specificare uno scope. Specifica lo scope associato alla riga della tabella e assicurati che contenga un qualche riferimento ai dati della riga cliccata.
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Jan 2010
Messaggi: 328
|
per quanti riguarda l'utilizzo delle modali, ho creato:
$scope.openEditModal = function() { alert("entro il modal"); var modalInstance = $modal.open({ templateUrl: 'pag/upd_record_utente.html', //controller: 'UserListCtrl', resolve: { items: function () { return $scope.items; } } }) }; ma quando la chiama con ng-click=openEditModal() mi dice che open non è definito, per quale motivo? Altrimenti trono ad usare il routeprovider e cambiare pagina, ma resta da capire come portarsi lo scope da caricare nella pagina |
![]() |
![]() |
![]() |
#20 |
Bannato
Iscritto dal: Nov 2014
Messaggi: 292
|
Cos'e' "$modal"?
Il metodo e' presente nel servizio $uibModal che devi iniettare tramite dependency injection. Qua c'e' il Plunker dell'esempio riportato dalla documentazione: https://plnkr.co/edit/NeX82nSM84n3VH6jPlvr?p=preview $uibModal e' iniettato alla seconda riga di example.js. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:13.