2016-03-03 66 views
0

如何从工厂内的嵌套$ http访问控制器内的响应。这里我们有两个服务电话。一个在另一个里面。我需要我的控制器中的第二个服务电话的响应。我可以从控制器访问工厂,也可以访问工厂内的响应,但是当涉及到控制器成功功能时,它显示成功功能未定义。如何访问控制器内的工厂方法?

工厂代号:我在这里呼吁嵌套$ http服务调用

bosAppModule.factory("ServiceCalls",function($http){ 

    var ServiceCalls={}; 
    var createFilterString = function(crudObject, callback) { 
     var filterString = ""; 
     var keyValuePairs = []; 

     // iterate over the property 
     for(var property in crudObject) { 
      if(!(crudObject[property] instanceof Object)) {// if it is primitive type 
       // check the value is not null or undefined 
       if(crudObject[property] && crudObject[property] != "") 
        // added the key value string 
        keyValuePairs.push(property + "~;~" + crudObject[property]); 
      } 
     } 

     // add first key value pair 
     if(keyValuePairs[0]) 
      filterString += keyValuePairs[0]; 

     // iterate over the key value strings 
     for(var i = 1; i < keyValuePairs.length; i++) { 
      filterString += "~$~" + keyValuePairs[i]; 
     } 

     try { 
      if(callback) callback(filterString); 
     } catch(e) { 
      console.log("Exception inside $dataTransactor->createFilterString" + e.message); 
     } 
    }; 

// var headers = {Authorization: COOKIES.readCookie("Authorization"),requestmode:"ACK_URL"}; 
// headers.isRender = file.isRender; 
// if(file.inputDataHeaders) 
//  headers.inputData = file.inputDataHeaders; 

    ServiceCalls.getData = function(filterObject, file){ 

     createFilterString(filterObject, function(filterString){ 
      var headers = {Authorization: COOKIES.readCookie("Authorization"),requestmode:"ACK_URL"}; 
      headers.isRender = file.isRender; 
      if(file.inputDataHeaders) 
       headers.inputData = file.inputDataHeaders; 

      $http({ 
       method: 'GET', 
       url: file.fileUrl + "/" + $securityComponent.cryptograghicFunctions.encryptor(filterString), 
       headers: headers 
      }) 
      .then(function(requestHandlerResponce) { 
       console.log(requestHandlerResponce); 
       $http({ 
        method: 'GET', 
        url: requestHandlerResponce.data.links[1].href, 
        headers: headers 
       }).then(function(responceHandlerResponce) { 
        console.log("##### : "+JSON.stringify(responceHandlerResponce.data)); 
        return responceHandlerResponce; 
       }); 
      }) 



     }); 

    }; 

    return ServiceCalls 
}); 

控制器代码:这里我需要

bosAppModule 
     .controller(
       "custom-entity-design-ctrl", 
       function($scope, $document, $http, $localStorage, navigateEntityUrl, entityFormation,layoutDesignFactory, ServiceCalls) { 

        var layoutDesignFac=new layoutDesignFactory(); 
        var entityJson='{"entityInfo":{"entity":"","tenantId":"2b69af63-e2dc-43e5-9f0e-9fde52032d4c","timeStamp":"Tue Jun 16 2015 19:05:09 GMT+0530 (India Standard Time)"},"collections":{"Entity":{"meta":{"parentReference":"***","pkName":"***","fkName":"***"},"rowSet":[],"rowFilter":[]}}}'; 
        var crudObject = {}; 
        var file = { 
         fileUrl: $config.UIMetaData, 
         inputDataHeaders: entityJson 
        }; 


        ServiceCalls.getData(crudObject,file).success(function(response){console.log(response)}); 

}); 
+0

'ServiceCalls.getData'不回任何承诺,你最好使用['$ q'](https://docs.angularjs.org/api/ng/service/$q) –

回答

0

你的服务应该返回的承诺响应($ HTTP调用在你的情况)到控制器:

return $http({    // return this promise 
    method: 'GET', 
    url: file.fileUrl + "/" + $securityComponent.cryptograghicFunctions.encryptor(filterString), 
    headers: headers 
}).then(function(requestHandlerResponce) { 
    console.log(requestHandlerResponce); 
    return $http({   // return this promise as well 
    method: 'GET', 
    url: requestHandlerResponce.data.links[1].href, 
    headers: headers 
}).then(function(responceHandlerResponce) { 
    console.log("##### : "+JSON.stringify(responceHandlerResponce.data)); 
    return responceHandlerResponce; 
}); 

而只是为了一致尝试你瑟标准.then方法在你的控制器,而不是.success.error

ServiceCalls.getData(crudObject,file).then(function(response) { 
    console.log(response) 
}); 

最后有点不相干的说明,我想“回应”你的服务是拼写错误;)