函数完成计算后更新字段

时间:2016-07-14 07:25:05

标签: javascript angularjs

我得到了这个调用外部服务的函数,处理结果然后返回一个变量。

我希望将此变量插入到输入中,但是我做错了导致而不是更新函数末尾的表单(正如预期的那样)我必须再次调用该函数并且代码更新字段与FIRST执行的价值...
这是控制器:

    $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但没有成功......

4 个答案:

答案 0 :(得分:0)

也许您的服务导致了这个问题。尝试使用$ q并从您的服务返回承诺。然后像这样使用它

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

答案 1 :(得分:0)

试试这样:

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

编辑: 为此,您必须将服务设置为返回承诺。

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

答案 2 :(得分:0)

我的赌注是你的远程调用将使你的代码“超出角度环境”,所以当你从远程调用得到你的响应时,角度将不会知道这个并且不会消化。因此,您需要在ElseIf Me.cmbPARTNOSEARCH.ListIndex <> -1 Then If Me.cmbPARTNOSEARCH.ListIndex <> -1 Then 之后手动调用$scope.$digest(),或者将远程调用包装到vm.cercaSecondario = TreeService.getProClie();。这种方式角度将由它自己消化。

答案 3 :(得分: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
});