2016-07-14 12 views
0

私はこの関数を呼び出して外部サービスを呼び出し、結果を処理してから1つの変数を返します。

私はこの変数を入力に挿入したいが、関数の最後にフォームを更新するのではなく、何か間違った原因を実行している(2番目の時間に関数を呼び出す必要がある)最初の実行の値を持つフィールド...
これはコントローラです:

関数が計算を完了したときにフィールドを更新します

$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は、私は更新しようとしている分野です。

これはサービスです:

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; 
} 



例:私が最初にコードを実行します。すべてがうまくいく。
私はTHIS_LINEになると、フィールドは更新されません。
その後、SECOND時間のコードを実行し、THIS_LINEに到達すると、最初の実行の値でフィールドが更新されます。

何が間違っていますか?
私は$ timeoutと$ evalASyncを使用してみましたが、成功しませんでした...

+0

どこ 'TreeService'ためのコードはありますか? –

答えて

0

サービスによってこの問題が発生した可能性があります。 $ qを使い、あなたのサービスから約束を返してください。これは、あなたが約束を返すために、あなたのサービスを設定する必要が動作するように :

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

EDIT:次に、このようにしてください。この

$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

は機能しません。あなたのサービスが約束を返さないため、 "TreeService.getProClie(...)。は関数ではありません"と表示されます。 –

+0

このhttps://docs.angularjs.org/api/ng/service/$qを見て、サービス – donquixote

0

のようにそれを使用しています。

.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

を書き直してください。それは動作しません。それは "TreeService.getProClie(...)と言う。それでは関数 " –

+0

を置き換えてください.successで動作するはずです 編集:@donquixoteが言ったようにTreeServiceを約束して返すように設定する – BorcheIvanov

0

私の賭けは、あなたのリモート呼び出しが「角度文脈の外」にするようにコードを作成するように、何が起こるかの時間で、あなたがこれを知らないだろうな角度あなたのリモート呼び出しからのあなたの応答を得ることにあるだろうと消化しません。したがって、vm.cercaSecondario = TreeService.getProClie();の後に手動で$scope.$digest()に電話するか、または$q.when(remoteCall).then(...)にリモートコールをラップすることができます。このようにして、角度はそれ自身で消化されます。

+0

私はすでに$ digestを使ってみましたが、コンソールは"すでに進行中のアクション " –

0

書き込みgetProClieはこのように機能します。 あなたがコントローラに続いて

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

を連鎖約束する必要があります。

TreeService.getProClie().then(function(data){ 
    vm.cercaSecondario = data 
}, 
function(){ 
    //error handling 
}); 
関連する問題