2016-05-12 2 views
0

Ich möchte, dass meine HTTP-Antwortdaten dem Controller zur Verfügung stehen, um JSON-Daten in der View-Direktive ({{tipp}}) anzuzeigen. Während ich jedoch in der Steuerung Daten von der Fabrik protokollieren kann, werden die Daten nicht in brauchbarer Weise zur Verfügung gestellt.AngularJS: Der Controller protokolliert die http-Antwort der Factory als "undefined"

Wenn das, was von der Fabrik zur Verfügung gestellt wird, in der Steuerung protokolliert wird, ist es entweder "undefined" oder "keine Funktion". Aus dem folgenden Code wird „undefiniert“ angemeldet“

Bitte helfen Sie mir Recht, meine Verfehlungen Wie reinige ich dies, also als Fabrik .get Daten in der Steuerung verwenden

Controller:?

var MainCtrl = angular.module('MainCtrl', []); 

MainCtrl.controller('Ctrl2', [ "QuizViewServ", '$log', '$scope', 
function(QuizViewServ, $log, $scope){ 


$scope.init = function(){ 
    $scope.hint = "FooBar"; //Testing binding bw Ctrl2 & the view 
    $log.log(QuizViewServ.getQuizData.quizQz); // <-LOGS AS "UNDEFINED" 
} 

}]); 

Factory:.

var MainServ = angular.module('MainServ', []); 

MainServ.factory('QuizViewServ', ['$http', function($http){ 
console.log("factory working"); 

var getQuizData = function(){ 

    $http({ 
     method: 'GET', 
     url: '/assets/json.json' 
    }).then(function successCallback(response) { 
     console.log("inside successgul GET req"); 


     var quizQz; 
     quizQz = response.data.quizQs; 
     console.log(quizQz); 


    }, function errorCallback(response) { 

     alert("Trouble grabbing requested data.") 
    }); 
    } 
    return { 
    getQuizData : getQuizData 
    } 

}]); 
+0

lesen http://blog.ninja-squad.com/2015/05/28/angularjs-promises/ –

+0

@JBThis ein großer Artikel ist. Vielen Dank. –

+0

.... Er mispelte "Pony", tho. : -/ha. –

Antwort

1

$ http Versprechen verwendet das Ergebnis zurück, wenn QuizViewServ.getQuizData.quizQz verwenden, sind Sie lo gging nichts, da es asynchron ist.

In Ihrer Fabrik, geben Sie das Versprechen zurück, und in Ihrem Controller, behandeln Sie es.

var MainServ = angular.module('MainServ', []); 

MainServ.factory('QuizViewServ', ['$http', function($http){ 
console.log("factory working"); 

var getQuizData = function(){ 

    return $http({ 
     method: 'GET', 
     url: '/assets/json.json' 
    }) 
    } 
    return { 
    getQuizData : getQuizData 
    } 

}]); 

und in Ihrem Controller

var MainCtrl = angular.module('MainCtrl', []); 

MainCtrl.controller('Ctrl2', [ "QuizViewServ", '$log', '$scope', 
function(QuizViewServ, $log, $scope){ 


$scope.init = function(){ 
    $scope.hint = "FooBar"; //Testing binding bw Ctrl2 & the view 

    QuizViewServ.getQuizData().then(function(result){ 
     $log.log(result.data); 
    }); 
} 

}]); 
+0

das funktioniert. Und genau aus den oben genannten Gründen, die ich vernachlässigt habe. Bedeutet dies aber nicht, dass die "Geschäftslogik" des Iterierens durch Objekte der JSON-Datei im Controller bleiben muss? Aus Gründen der "Sauberkeit" sollte diese Logik im Dienst gehalten werden? Ich bestreite deine Antwort nicht, ich bin wirklich neugierig. –

+0

Es hängt davon ab, ob Sie mit den zurückgegebenen Daten unterschiedliche Behandlungen durchführen müssen. Wenn es für jeden Controller, der es verwendet, etwas einzigartig ist, sollten Sie es innerhalb des Controllers tun. Wenn mehrere Controller die gleichen Daten benötigen, dann führen Sie Ihre Datenverarbeitung in der Fabrik mit der Lösung von @Zohaib Ijaz durch, beide sind gültig: P Sie haben also grundsätzlich die Möglichkeit, beides zu tun, abhängig vom Szenario und Ihren persönlichen Vorlieben –

+0

Gefallen. Das macht total Sinn. Ja, ich habe Ihre und @ Zohaib Ijaz Lösungen versucht. Sie arbeiten beide, wie Sie sagten, in diff-Umständen. Vielen Dank. –

0

Sie müssen diese Daten retrun. Es ist nicht möglich, wie Sie es tun. Auch quizQz Eigenschaft ist privat. Sie können nicht darauf zugreifen, auch nachdem dieser Wert nach einem AJAX-Aufruf festgelegt wurde.

var getQuizData = function(){ 

return $http({ 
    method: 'GET', 
    url: '/assets/json.json' 
}).then(function successCallback(response) { 
    console.log("inside successgul GET req"); 


    var quizQz; 
    quizQz = response.data.quizQs; 
    console.log(quizQz); 
    return quizQz; 

    }, function errorCallback(response) { 

    alert("Trouble grabbing requested data.") 
    return ''; 
}); 

}

und in der Steuerung, erhalten Daten wie folgt.

QuizViewServ.getQuizData().then(function(data){ 
    console.log(data); 
}); 
+0

Sie können keine Daten in einer Zusage zurückgeben. Sie müssen sie einer Variablen zuweisen, die außerhalb dieser Zusage deklariert ist, oder das Objekt zurückgeben Promis. Meine Antwort ist die richtige Methode, um Daten aus einem Promis abzurufen. Geben Sie die Funktion zurück, die das Promis zurückgibt, und behandeln Sie es. http://stackoverflow.com/questions/26854654/get-data-out-of-a-promise-instead-of-returning-a-promise –

+0

Ich benutze Winkel in meiner Produktion App und ich weiß, wir können zurückkehren Daten, aber ich vermisste Rückkehr Anweisung vor $ http() hinzufügen –

+0

Dann müssten Sie $ beobachten das Ergebnis von 'getQuizData()', die wie schlechte Praxis scheint, wenn es der Fall ist, bin ich neugierig, wie Sie es tun –

Verwandte Themen