6

Sono nuovo a angularjs. Ho problemi ad accedere al valore restituito dal servizio angularjs nel suo controller. seguito è il codice di controllo:Come fare in modo che il controller attenda che il servizio restituisca un valore e come accedere al valore restituito nel controller?

'use strict'; 
app.controller('AdminTaskCtrl', function ($scope, Search) { 
    $scope.buildEnquiry = function (collegeId,) { 
     Search.getIdByEmail(collegeId).then (function (result) { 
      $scope.uId = result; 
      console.log($scope.uId); 
     }); 
    }; 
});//controller ends here 

E il codice di servizio di ricerca è la seguente:

'use strict'; 
      app.factory('Search',function ($firebase, FIREBASE_URL, $rootScope) { 
          var simpleuser = ""; 
          getIdByEmail: function(counsellorEmail) { 
          var collegeuserArray = ($firebase(new Firebase(FIREBASE_URL+"abc/def/")).$asArray()); 
          collegeuserArray.$loaded(function(collegeuserArray) { 
           for(var i=0; i<collegeuserArray.length; i++) 
           { 
           if((collegeuserArray[i].$value) == counsellorEmail) 
           { 
            simpleuser = collegeuserArray.$keyAt(collegeuserArray[i]); 
            console.log(simpleuser); 
            return simpleuser; 
           } 
           } 
          }, function(error) { 
           console.error("Error:", error); 
          }); 
        } 
        };  
      );//service ends here. 

Quando il codice viene eseguito dà errori per .then funzione come Fallows :

TipoErrore: non definito non è una funzione e il valore nel controller non è accessibile.

Per favore aiuto.

+0

è necessario implementare '' $ q'' nella vostra fabbrica, controllare questo: https://docs.angularjs.org/api/ng/service/$q –

+0

Hey Deblaton Jean-Philippe, sto avendo problemi nell'implementazione di $ q nella mia fabbrica. Potresti guidarmi attraverso il processo ... !! ? –

+0

cos'è $ firebase e perché lo restituisci prima? A volte inserisci il tuo ciclo "for"? –

risposta

4
'use strict'; 
     app.factory('Search',function ($firebase, FIREBASE_URL, $rootScope, $q) { 
         var simpleuser = ""; 
         getIdByEmail: function(counsellorEmail) { 
         var deferred = $q.defer(); 
         var collegeUserArray = ($firebase(new Firebase(FIREBASE_URL+"abc/def/")).$asArray()); 
         collegeUserArray.$loaded(function(collegeUserArray) { 
          for(var i=0; i<collegeUserArray.length; i++) 
          { 
          if((collegeUserArray[i].$value) == counsellorEmail) 
          { 
           simpleUser = collegeUserArray.$keyAt(collegeUserArray[i]); 
           console.log(simpleUser); 
           //return simpleUser; 
           deferred.resolve(simpleUser); 
          } 
          } 
         }, function(error) { 
          console.error("Error:", error); 
          deferred.reject(error); 
         }); 
         return deferred.promise; 
       } 
       };  
     ); 

E il controller

'use strict'; 
app.controller('AdminTaskCtrl', function ($scope, Search) { 
    $scope.buildEnquiry = function (collegeId,) { 
    Search.getIdByEmail(collegeId).then (function (result) { 
     $scope.uId = result; 
     console.log($scope.uId); 
    }, function(error){ 
     //If an error happened, handle it here 
    }); 
    }; 
}); 
+0

Grazie a Deblaton Jean-Philippe. Il codice ha funzionato per me. –

+0

Anche qui la sintassi appare non valida, copiata dalla domanda originale. Inoltre, $ caricato restituisce già una promessa. – Kato

1

Per rispondere direttamente alla tua domanda, $loadedreturns a promise, quindi la risposta più semplice sarebbe di restituirlo a partire il vostro servizio, invece di preoccuparsi con $ q e tutte queste altre cose .

Sembra che l'intera premessa qui sia difettosa e che questo sia uno XY problem. Sembra che diversi hack intendano sovvertire l'uso previsto di queste librerie e, come una buona lettura solida di Angular walkthrough e lo AngularFire guide, farebbe risparmiare molto dolore e complessità inutile.

L'uso della fabbrica qui è una sovversione e fortemente accoppiata. La sintassi non è valida e non verrebbe compilata. E alla fine, l'obiettivo è aggiungere un metodo di ricerca all'array sincronizzato restituito da AngularFire, che dovrebbe essere fatto con $ extendFactory.

app.factory('firebaseRef', function(FIREBASE_URL) { 
    return function(path) { 
     var ref = new Firebase(FIREBASE_URL); 
     if(path) { ref = ref.child(path); } 
     return ref; 
    } 
}); 

app.factory('SearchableArray', function($firebase, $FirebaseArray) { 
    var ArrayWithSearch = $FirebaseArray.$extendFactory({ 
    searchByEmail: function(emailAddress) { 
     var res = null; 
     for(var i=0, len=this.$list.length; i < len; i++) { 
      if(this.$list[i].email === emailAddress) { 
       res = this.$list[i]; 
       break; 
      } 
     } 
     return res; 
    } 
    }); 

    return function(ref) { 
     return $firebase(ref, {arrayFactory: ArrayWithSearch}).$asArray();  
    } 
}); 

app.controller('Controller', function($scope, SearchableArray, firebaseRef) { 
    $scope.data = SearchableArray(firebaseRef('abc/def')); 

    $scope.search = function(email) { 
     console.log($scope.data.searchByEmail(email)); 
    }; 
});