2017-01-11 1 views
0

Hi ich versuche, meine eckigen js Fabrikdaten zu meinem Controller zu ziehen, bitte sehen Sie, wenn es ein Problem gibt.Angular Js: Wie man Fabrikdaten zum Kontroller zieht

factory.js

.factory('History', ['$http', '$q', function ($http, $q) { 

     function history() { 

      // angular.extend(SearchOptions.getDefaults(), params, options); 
      var deferred = $q.defer(); 

      $http({ 
       method: 'GET', 
       url: '/res/orders/' + 31536427 + '/history-group' 
      }) 
      .success(function (res) { 
      // console.log(res); 

      }) 
      .error(function (err) { 
       // TODO error handler 
       deferred.reject(err); 
      }); 

      return deferred.promise; 
     } 

     return { 
      history: history 
     }; 
    }]); 

controller.js

.controller('HistoryCtrl', ['$scope', '$state', '$stateParams', 'History', function($scope, $state, $stateParams, History) { 

     History.history().then(function(res) { 
      console.log(res); 
      $scope.history = res.body; 
      console.log($scope.history); 

     }, function(err) { 
      // TODO error handler 
      console.log(err); 

     }) 
     .finally(function(err) { 

     }); 



    }]); 

Antwort

3

Sie benötigen, wie unten die Antwort in der Erfolgsfunktion in der 'Geschichte' Werk weitergeben müssen:

.success(function (res) { 
    // console.log(res); 
    deferred.resolve(res); 
}) 
1

Das Problem Mit Ihrem Code lösen Sie das Versprechen nicht, nachdem Sie die Daten in der Erfolgsrückruffunktion erhalten haben. Lösen Sie es wie unten in der Funktion .success Rückruf gezeigt:

deferred.resolve(res); 

Nur wenige Punkte Ihren Code zu verbessern:

  1. $http Service in Angular standardmäßig kehrt ein Versprechen. Daher müssen Sie nicht explizit eine promise mit $q, die eine Anti-Muster() ist. Nur $http Objekt von dem Dienst selbst zurückgeben wird den Job tun. Doing return $http() entspricht return deferred.promise() in Ihrem Code.

  2. .success und .error Rückrufe werden in der neuesten Version (1.6) von AngularJs (Deprecation Notice) ist veraltet. Der Nachteil der Verwendung dieser ist, dass sie nicht verkettbar sind, da sie Rückgabewerte ignorieren. Daher ist es besser, stattdessen .then zu verwenden.

    .factory('History', ['$http', function ($http) { 
    
        function history() { 
         return $http({ 
            method: 'GET', 
            url: '/res/orders/' + 31536427 + '/history-group' 
           }) 
           .then(successCallback, errorCallback); 
        } 
    
        function successCalback (res) { 
         return res; 
        } 
    
        function errorCalback (err) { 
         return err; 
        } 
    
        return { 
         history: history 
        }; 
    }]); 
    
    :

Anwendung über Änderungen können Ihren Dienst unter Refactoring

Verwandte Themen