81 messaggi dal 12 settembre 2010
Ciao a tutti,
ho un problema nell'aggiornare una variabile dello scope di angular dopo aver effettuato delle chiamate http verso un endpoint ed aver ottenuto i risultati desiderati.

Questo è il servizio che ho scritto per realizzare le chiamate POST e GET:

app.service('ApiCall', ['$http', '$q', function ($http, $q) {
    var result;

    this.GetApiCall = function (url, obj, tokenId) {
        var deferred = $q.defer();
        var options = {
            method: 'GET',
            url: obj != null ? url + '?' + obj : url,
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json',
                'X-TOKENID': tokenId
            }
        }
        $http(options).success(function (data, status) {
            deferred.resolve(data);
        }).error(function (err, status) {
            typeof (err) === "string" ? err = { status: status } : (err == null ? err = { status: status } : err.status = status);
            console.log('error: ', err);
            deferred.reject(err);
        });
        return deferred.promise;
    }

    this.PostApiCall = function (url, obj, tokenId) {
        var deferred = $q.defer();
        var options = {
            method: 'POST',
            url: url,
            headers: { 'Accept': 'application/json', 'Content-Type': 'application/x-www-form-urlencoded' },
            data: obj
        }
        if (tokenId != '') {
            options.headers['Content-Type'] = 'application/json';
            options.headers['X-TOKENID'] = tokenId;
        }
        result = $http(options).success(function (data, status) {
            deferred.resolve(data);
        }).error(function (err, status) {
            typeof (err) === "string" ? err = { status: status } : (err == null ? err = { status: status } : err.status = status);
            console.log('error: ', err);
            deferred.reject(err);
        });
        return deferred.promise;
    }
}]);


Questa è una factory che ho scritto per effettuare la chiamata e poi passare il risultato finale al controller principale dell'applicazione:

app.factory('DemoAPI', ['ApiCall', 'serializeData', function (ApiCall, serializeData) {
    return {
        Test: function (endpoint, tokenId) {
            var response = [];
            jsonData = {
                showSubNodeIds: true
            }
            var QuickSearchIds = ["f9d524c9239a409292945a90ad395676", "1ac85a1369a44572a9643e7cca59ccdb", "14c0661a0e764cc28e1fc6bfca356440", "4b6bebd82b0e4354993552a8861985f8", "2f74995d716a45db865a728f4e119ae0"];
            angular.forEach(QuickSearchIds, function (nodeId) {
                ApiCall.GetApiCall(endpoint + nodeId, serializeData.serializeDataFn(jsonData), tokenId).then(function (data) {
                    if (data.resultCode == 'OK' && data.item != null && data.item.subNodes > 0) {
                        angular.forEach(data.item.subNodeIds, function (id) {
                            ApiCall.GetApiCall(endpoint + id, serializeData.serializeDataFn(jsonData), tokenId).then(function (data) {
                                if (data.resultCode == 'OK' && data.item != null) {
                                    response.push(data.item);
                                }
                            });
                        });
                    }
                });
            });
            return response;
        }
    };
}]);


All'interno del controller quando assegno il risultato ottenuto all'interno della factory ad una variabile dello scope praticamente la variabile non viene aggiornata e quindi non riesco a visualizzare i valori sulla vista:

$scope.test = DemoAPI.Test(endpoint, config.tokenId);


Potete aiutarmi indicandomi cosa sbaglio e come posso rimediare a questo problema?

Vi ringrazio in anticipo.

Saluti,
Alessio.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Alessio,
Il tuo metodo DemoAPI.Test sta restituendo un array vuoto, ed è per questo che non sta funzionando. Dato che i risultati sono ottenuti con richieste asincrone alla web api, il metodo DemoAPI.Test dovrebbe restituire una promise, proprio come stai già facendo negli altri metodi GetApiCall e PostApiCall.

A quel punto potrai fare:
DemoAPI.Test(endpoint, config.tokenId).then(function(items) {
  $scope.test = items;
});


ciao,
Moreno

Enjoy learning and just keep making
81 messaggi dal 12 settembre 2010
Ciao Moreno,
grazie mille per il supporto.
Ho risolto e adesso sto andando avanti con gli sviluppi...volevo chiederti se sulla console di sviluppo di google chrome hai mai visto un errore di questo tipo:

Refused to get unsafe header "X-MiniProfiler-Ids"


Mi compare nel momento in cui faccio diverse chiamate asincrone tramite $http di AngularJs.

Ti ringrazio in anticipo.

Saluti,
Alessio.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao, è un problema legato a CORS.
Stai facendo richieste ajax a una web api pubblicata in un'altra origine (cioè altro dominio, porta o protocollo) e quindi il browser applica delle restrizioni. Ad esempio, impedisce di leggere con javascript le intestazioni della risposta se il server della web api non ha esplicitamente dato il consenso a farlo.
Quindi, il tentantivo di lettura dell'intestazione X-MiniProfiler-Ids (così come il tentativo di leggere altre intestazioni) fallirà a meno che la tua applicazione web api non restituisca anche quest'altra intestazione.
Access-Control-Expose-Headers: X-MiniProfiler-Ids


Ecco delle informazioni sull'argomento:
https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Access-Control-Expose-Headers

Se la tua webapi è stata realizzata con ASP.NET Web API, leggi questo articolo:
http://www.aspitalia.com/script/1166/Supportare-CORS-ASP.NET-Web-API.aspx

Il punto interessante è questo, dove indichi le origini, le intestazioni e i metodi consentiti.
config.EnableCors(new EnableCorsAttribute(origins: "*", headers: "*", methods: "GET,POST,PUT,DELETE"));

In questo esempio viene consentito tutto ma tu ovviamente non usare questa riga di codice tale e quale. Imposta solo le origini, le header (come X-MiniProfiler-Ids) e i method rilevanti nel tuo caso.

ciao,
Moreno
Modificato da BrightSoul il 27 agosto 2018 09.32 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.