2016-07-14 11 views
0

Ich habe diese Funktion, die einen externen Dienst aufruft, arbeitet die Ergebnisse und gibt dann eine einzelne Variable zurück.

Ich möchte diese Variable in eine Eingabe eingefügt werden, aber ich mache etwas falsch Ursache, anstatt das Formular am Ende der Funktion zu aktualisieren (wie erwartet) Ich muss die Funktion ein zweites Mal aufrufen und der Code aktualisiert die Feld mit dem Wert der ersten Ausführung ...
Dies ist der Controller:

Update-Feld, wenn Funktion die Berechnungen beendet

$scope.cercaClienteNomeCognome = function() { 
    if ($scope.nome == undefined){ 
     var name = ""; 
    } else name = angular.uppercase($scope.nome); 
    if ($scope.cognome == undefined){ 
     var surname = ""; 
    } else surname = angular.uppercase($scope.cognome); 
    var url = "servizi/getClienteNomeCognome?nomeCliente="+name+"&cognomeCliente="+surname; 
    esitoRicercaEstesa = TreeService.avviaRicercaEstesa(url); 
    if (esitoRicercaEstesa == "true") { 
     vm.cercaSecondario = TreeService.getProClie();  // THIS_LINE 
    } 
    }; 



vm.cercaSecondario ist das Feld, das ich zu aktualisieren bin versucht.

Dies ist der Service:

service.avviaRicercaEstesa = function(url) { 
    service.url = url; 
    $http.get(url) 
    .success(function(data, status, headers, config) { 
     service.apriModaleEstensioneRicerca(data); 
    }) 
    .error(function(data, status, headers, config) { 
      toaster.error("[SERVIZIO RECUPERO CLIENTI] Errore durante il ritrovamento dei clienti");    
    }); 
} 

service.setProClie = function (pro_clie) { 
    service.pro_clie = pro_clie; 
} 

service.getProClie = function() { 
    return service.pro_clie; 
} 



Beispiel: Ich habe den Code zum ersten Mal ausgeführt werden. Alles geht gut.
Wenn ich zu THIS_LINE komme, wird das Feld nicht aktualisiert.
Ich lasse dann den Code für die ZWEITE Zeit laufen und wenn ich zu THIS_LINE komme, aktualisiert das Feld mit dem Wert von der ERSTEN Ausführung ......
Was mache ich falsch ?!
Ich habe sogar versucht mit $ Timeout und $ evalASync, aber mit keinem Erfolg ...

+0

Wo ist der Code für 'TreeService'? –

Antwort

0

Vielleicht hat Ihr Service dieses Problem verursacht. Versuchen Sie, $ q zu verwenden und Versprechen von Ihrem Dienst zurückzugeben. Benutzen Sie diese dann wie dieses

$scope.cercaClienteNomeCognome = function() { 
    if ($scope.nome == undefined){ 
     var name = ""; 
    } else name = angular.uppercase($scope.nome); 
    if ($scope.cognome == undefined){ 
     var surname = ""; 
    } else surname = angular.uppercase($scope.cognome); 
    var url = "servizi/getClienteNomeCognome?nomeCliente="+name+"&cognomeCliente="+surname; 
    esitoRicercaEstesa = TreeService.avviaRicercaEstesa(url); 
    if (esitoRicercaEstesa == "true") { 
     TreeService.getProClie().then(function (cercaSecondario) { 
      vm.cercaSecondario = cercaSecondario; 
     }); 
    } 
    }; 
+0

funktioniert nicht. Es sagt "TreeService.getProClie (...). Dann ist keine Funktion" –

+0

, weil Ihr Dienst keine Versprechen zurückgibt. Sehen Sie sich dieses https://docs.angularjs.org/api/ng/service/$q an und schreiben Sie Ihren Dienst um – donquixote

0

wie diese versuchen:

TreeService.getProClie() 
.then(function(res){ 
    vm.cercaSecondario = res; 
}) 

EDIT: Dieses Sie Ihre Serviceversprechen zurück setzen müssen, um zu arbeiten.

.service('TreeService', function($q){ 
var data = this; 
data.getProClie = function(){ 
var defer = $q.defer(); 
$http.get('example/url') 
.success(function(res){ 
    defer.resolve(res) 
}) 
.error(function(error,status){ 
defer.reject(error); 
}) 
return defer.promise; 
}; 
}) 
+0

nein. Es funktioniert nicht. Es heißt "TreeService.getProClie (...).dann ist keine Funktion " –

+0

Ersetze .dann mit .erfolgreich sollte es funktionieren Edit: wie @donquixote sagte. Du musst deinen TreeService setzen, um Versprechen zu geben – BorcheIvanov

0

Meine Wette wäre, dass Ihr Remote-Aufruf Code machen „aus Winkel Kontext“ so zu sein, was, dass Sie Ihre Antwort von der Remote-Anruf Winkel nicht wissen, diese erhalten durch die Zeit ist passiert, und wird nicht verdauen. Sie müssen also entweder $scope.$digest() nach vm.cercaSecondario = TreeService.getProClie(); manuell anrufen oder Sie können Ihren Remote-Anruf in $q.when(remoteCall).then(...) verpacken. Auf diese Weise wird eckig selbst verdauen.

+0

Ich habe bereits versucht mit $ Digest, aber die Konsole löst eine Ausnahme aus" Aktion läuft bereits " –

0

schreiben getProClie Funktion auf diese Weise. Sie müssen versprechen

service.getProClie = function() { 
    var defer = $q.defer(); 
    defer.resolve(service.pro_clie); 
    return defer.promise; 
} 

Dann im Controller Verkettungs:

TreeService.getProClie().then(function(data){ 
    vm.cercaSecondario = data 
}, 
function(){ 
    //error handling 
}); 
Verwandte Themen