2016-05-11 20 views
1

Ich baue eine AngularJS-App und habe Dienste erstellt, die Ajax-Anfragen ausführen. Durch Versprechungen kehren sie zurück, sobald diese Anforderungen erfüllt sind, um die für meine Sicht erforderlichen Daten zu erhalten.Zugriff auf einen Werksdienst, nachdem ein Versprechen zurückgegeben wurde

using $ .Deferred(). Then() Ich kann warten, bis meine Anfrage abgeschlossen ist, bevor ich weiteren Code auf dem Controller ausführe, aber ich habe ein Problem in Bezug auf das Scoping.

Ich möchte eine zweite Anfrage ausführen, die einige der gesammelten Daten von der ersten verwenden muss und daher warten muss, bis das Versprechen erfüllt ist, bevor der Dienst ein zweites Mal aufgerufen wird.

Das Problem ist, ich kann nicht auf meine Werksdienst in den Versprechen. Then() -Funktion zugreifen, obwohl es richtig in den Controller injiziert. Wie kann ich die Fabrik in diesem Versprechen zurückgeben, damit ich es auf diese Weise ein zweites Mal anrufen kann?

My-View-Controller-Funktionen:

function getCategories() { 
     datacontext.getCategories() 
      .then(function (data) { 
       if (data) { 
        vm.categories = data; 
        categoriesPromise.resolve(data); 
       } else { 
        throw new Error('Error obtaining data.'); 
       } 
      }) 
      .catch(function (error) { 
       common.logger.log('error', 'Error obtaining the categories.', error, controllerId); 
      }) 
    } 

    function getUsers() { 

     // Wait until the categories are loaded 
     categoriesPromise.then(function (categories) { 
      // I want to use dataContext again here 
     }) 
    } 

Ich möchte die Datacontext in getCategories im categoriesPromise.then wieder verwendet() verwenden, innerhalb GetUsers().

+0

TLDR; einige Code wird uns helfen –

+0

Hinzugefügt meine Ansicht Controller-Code. –

Antwort

0

Erstellen Sie Ihr Werk auf diese Weise:

.factory("MyFactory", ['$q', function ($q) { 
      return { 
       get: function (_tagName) { 
        var deferred = $q.defer(); 
        $http.get(_tagName, function (err, result) { 
         if (err) { 
          return deferred.reject(err); 
         } else if (result) { 
          return deferred.resolve(result); 
         } 
        }); 
        return deferred.promise; 
       } 
} 
}]) 

Dann ist es Spritzen in Ihrem Controller:

.controller('myCtrl', ['$scope','MyFactory', 
     function ($scope, MyFactory) { 

    $scope,getData = function(){ 

    var success=function(data){ 
     console.log("Data return successfully", data); 
    },error = function(err){ 
     console.log("something went wrong", err) 
    } 

    MyFactory.get("tagName").then(success,error) 
}; 
}]); 

Ich hoffe, dies wird Ihnen helfen.

+0

Ich habe es injiziert wie 'angular.module ('app'). Controller (controllerId, ['$ rootScope', '$ location', 'common', 'datacontext', 'spContext', 'userContext', Kategorien]) ; 'und es kann immer noch nicht zugegriffen werden. –

+0

und dann im Controller wie 'Funktionskategorien ($ rootScope, $ location, common, datacontext, spContext, userContext) {' –