2016-10-28 96 views
0

我是AngularJs的新手。任何人都可以幫助編寫一個工廠,使用http服務在angularJS中,以便工廠返回給我一個業務對象而不是promise,或者在成功時爲scope變量賦值。我在網上研究了很多文章,但都使用回調函數或通過返回http服務的承諾。
要求:假設XMLtoJsonService是我的工廠,它將xml從本地文件夾轉換爲json。工廠應返回的業務對象,這樣在我的控制,我應該能夠在以下方式使用如何從工廠使用http返回業務對象get angularjs

//controller 
    var obj = XMLtoJsonService.MethodName(); 

**(No promises or callback function should be used in controller)** 
/*******service code****************/ 

    App.factory('XmlToJsonSvc', 
      [ '$http', function($http) { 
       return { 
        get : function(path, callback) { 
         $http.get(path, { 
          transformResponse : function(data) { 
           // convert the data to JSON and provide 
           // it to the success function below 
           var x2js = new X2JS(); 
           var json = x2js.xml_str2json(data); 
           return json; 
          } 
         }).success(function(data, status) { 
          //console.log('Sucess'); 

          callback(data); 
         }) 
        } 
       } 
    } ]); 

/*********Controller Code **********/ 
var setData = function(data) { 

      return new Menus(data); 

      debugger 
     } 
     var path = "Configs/Config.xml"; 
     XmlToJsonSvc.get(path, setData); 

//此代碼工作正常 //但我的要求是把這段代碼轉換,這樣在我的控制器它應該像// VAR OBJ = XmlToJsonSvc.get(路徑) // OBJ應該有,我會使用其他服務

+0

所以你打算阻止整個BR JSON對象owser等待http響應? –

+0

不,但我想使用可以返回給我一個業務對象的服務。我基於從服務返回的json對象初始化對象。 – ceepee

+0

然後你應該承諾解決你的服務。它可能工作。 – SayusiAndo

回答

0

<!--In this funcion calling factory function restCall() from controller. 
 
before that i have assigned a already created factory object to a scope variable in controller 
 
.So whenever factory varaible updates,that update will be available to controller automatically. 
 
Some kind of 2-way binding method from factory object--> 
 

 

 
<!DOCTYPE html> 
 
<html lang="en" ng-app="app"> 
 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title>Test</title> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.8/angular.min.js"></script> 
 
</head> 
 
<body ng-controller="myCtrl"> 
 
    {{obj.data1}} 
 
    
 
    <button ng-click="clickFn()">Clicking this will call service</button> 
 

 
<script> 
 

 
    (function() { 
 
     var app = angular.module("app",[]) 
 
     
 
     .controller("myCtrl",function(myFactory,$scope){ 
 
     
 
     $scope.obj = myFactory.bObject; 
 
     
 
     $scope.clickFn = function(){ 
 
      myFactory.restCall(); 
 
     } 
 
     
 
      
 
     }).factory("myFactory",function($timeout){ 
 
     
 
     var bObject = { 
 
      data1 :null 
 
     }; 
 

 
     function restCall(){ 
 
      $timeout(function(){ 
 
      bObject.data1 = bObject.data1 ? false : true ; 
 
      },1000); 
 
     } 
 
     
 
     var service = { 
 
      bObject : bObject, 
 
      restCall : restCall, 
 
     } 
 
     return service; 
 
     
 
     }); 
 
    }()); 
 

 
</script> 
 

 

 
</body> 
 
</html>

+0

感謝Nikhil的迴應。我需要一些像這樣我有一個工廠App.factory( 'XmlToJsonSvc', \t \t [ '$ HTTP',函數($ HTTP){ \t \t \t回{ \t \t \t \t得到:函數(路徑,回調){ \t \t \t \t \t $ http.get(路徑,{ \t \t \t \t \t \t transformResponse:功能(數據){ \t \t \t \t \t \t \t //將數據轉換爲JSON和提供 \t \t \t \t \t \t \t //它下面 \t \t \t \t \t \t \t變種x2js =新X2JS成功函數(); \t \t \t \t \t \t \t變種JSON = x2js.xml_str2json(數據); \t \t \t \t \t \t \t return json; \t \t \t \t \t \t} \t \t \t \t \t})。成功(功能(數據,狀態){ \t \t \t \t \t \t //控制檯。日誌( 'Sucess'); \t \t \t \t \t \t callback(data); \t \t \t \t \t})\t \t \t \t}}]); 我需要修改此服務 – ceepee

+0

但在這裏你提到了一個回調 –

+0

U可以使用任何東西或任何邏輯在工廠,但不在控制器.U可以寫任何數量的服務或包裝功能在這上面,但在控制器我應該使用像var obj = Xmlsercvice.MethodName()。 – ceepee