2017-02-18 2 views
0

私は想定されていないものを試しているかもしれません。 まだ「シングルトン」のことを頭で包んだことはありません。空のオブジェクトを返すIonic Factory

私は、APIからいくつかのjsonデータを取得するサポートを提供しています。 工場から空のオブジェクトが返されています。

ご協力いただきまして誠にありがとうございます。

.factory('specialities', function($http){ 
    var specialities = []; 
    return { 
     getspecialities: function(){ 
      $http({ 
       method: 'GET', 
       url: "https://mydomain.abc/Api/specialities", 
       headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
      }).then(function successCallback(response) {  
       specialities = response.data.list; 
      }, function errorCallback(response) { 

      }); 
      return specialities; 
     } 
    }    
}) 

これは私のコントローラです。

.controller('loadingCtrl', ['$scope', '$stateParams', 'specialities', 'areas', '$timeout', 
function ($scope, $stateParams, specialities, areas, $timeout) { 
    $scope.specialities = specialities.getspecialities(); 
    $scope.areas = areas.getareas(); 
    //console.log($scope.areas); 
    $scope.slide = function(){ 
     console.log($scope.specialities); 
     console.log($scope.areas); 
    } 
    $timeout($scope.slide, 5000); 
}]) 

タイムアウト後もコンソールに空の配列があります。 助けてください。

はありがとう

----編集 私は以下のコードをしようとしています。 コントローラ

.controller('loadingCtrl', ['$scope', '$stateParams', 'specialities', '$timeout', '$state', 
function ($scope, $stateParams, specialities, $timeout, $state) { 
    specialities.getspecialities().then(function(specialities) 
    { 
     $scope.specialities = specialities; 
     console.log($scope.specialities); 
    }); 
}]) 

工場

.factory('specialities', function($http, $q){ 
    return { 
     getspecialities: function(){ 
      return $http({ 
       method: 'GET', 
       url: "https://mydomain.abc/Api/specialities", 
       headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
      }).then(function successCallback(response) {  
       return response.data.list; 
      }); 
     } 
    }    
}) 

は今、コンソールがログに記録したことがないと、工場はAPIのURLが呼び出されていないためと呼ばれる呼び出されないことのようです。

答えて

0

$httpの呼び出しはasyncであり、Promiseを返します。

return specialitiesは、$httpコールが開始された直後に実行されますが、実際には処理が完了する前に実行されます。

getspecialities関数を実際に戻り値$http(プロミス)を返すように変更し、それを呼び出すときにその約束を使用してください。

サービス:

.factory('specialities', function($http, $q){ 
    return { 
     getspecialities: function(){ 
      return $http({ 
       method: 'GET', 
       url: "https://mydomain.abc/Api/specialities", 
       headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
      }).then(function successCallback(response) {  
       return response.data.list; 
      }; 
     } 
    }    
}) 

コントローラー:

.controller('loadingCtrl', ['$scope', '$stateParams', 'specialities', 'areas', '$timeout', 
function ($scope, $stateParams, specialities, areas, $timeout) { 
    specialities.getspecialities().then(function(specialities) 
    { 
     $scope.specialities = specialities; 
     ... any other stuff that needs to happen when you receive the value of specialities ... 
    }); 
    ... 

}]) 
+0

私はコードを試しました。しかし、ファクトリの機能が呼び出されないようです。私はあなたの提案を反映するために私の答えを更新しました。 –

+0

ログをさらに追加して、実行されるコードパスを確認します。あなたの '$ http'呼び出しはエラーを返す可能性があります(それぞれの' then'に2番目の関数を追加し、チェックのために何が起こるかをログに記録することが可能です)。 – jcaron

+0

私は本当に興奮していたが、実際にドメイン名を変更しなかった。ハハ。それは今働いている。お手伝いありがとう。 –

0

.controller('loadingCtrl', ['$scope', '$stateParams', 'specialities', '$timeout', '$state', 
function ($scope, $stateParams, specialities, $timeout, $state) { 
    specialities.getspecialities(function(specialities) 
    { 
     $scope.specialities = specialities; 
     console.log($scope.specialities); 
    }); 
}]); 

この代わりに

コントローラ

を試してみてくださいサービス

.factory('specialities', function($http, $q){ 
    return { 
     getspecialities: function(callback){ 
      return $http({ 
       method: 'GET', 
       url: "https://mydomain.abc/Api/specialities", 
       headers: {'Content-Type': 'application/x-www-form-urlencoded'} 
      }).then(function successCallback(response) {  
       return callback(response.data.list); 
      }); 
     } 
    }    
}) 
関連する問題