6

angularjs adresinde yeni. Denetleyici içinde angularjs hizmetinden döndürülen değerine erişmede sorun yaşıyorum.Denetleyici bir hizmetin bir değer döndürmesini ve denetleyicideki döndürülen değere nasıl erişileceğini nasıl bekler?

'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. 

kod çalıştırır Taksonların .o fonksiyonu için hata veriyor: aşağıdaki gibidir

'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 

Ve Arama hizmetimizde kodu: ardından denetleyicisi kodudur :

TypeError: undefined bir işlev değil ve denetleyicideki değere erişilemiyor.

Lütfen

Yardım edin. Burada basit cevap $ q ve tüm bu şeylerle rahatsız yerine hizmetinden geri olacaktır böylece

+0

Eğer fabrikaya '$ q''' uygulaması gerektiğini, bu kontrol edin: https://docs.angularjs.org/api/ng/service/$q –

+0

Deblaton Jean-Philippe Hey, yaşıyorum fabrikamda $ q uygulamasında sorun var. Lütfen bana süreç boyunca rehberlik edebilir misiniz ... !! ? –

+0

$ firebase nedir ve neden önce iade edersiniz? Bazen "for" döngüsüne giriyor musun? –

cevap

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; 
       } 
       };  
     ); 

Ve kontrolör

'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

Teşekkürler Deblaton Jean-Philippe. Kod benim için çalıştı. –

+0

Buradaki sözdizimi, orijinal sorudan kopyalanan da geçersiz görünüyor. Ayrıca, $ yüklü zaten bir söz verir. – Kato

1

doğrudan soru, $loadedreturns a promise cevaplamak için .

Bütün önermenin burada olduğu gibi görünüyor ve bu bir XY problem. Bu lib'lerin amaçlanan kullanımını bozmak için tasarlanmış birkaç hack gibi görünüyor ve Angular walkthrough ve AngularFire guide'un sağlam bir okuması gibi burada çok fazla acı ve gereksiz karmaşıklık biriktirir.

Buradaki fabrikanın kullanımı bir yıkım ve ağır bir şekilde birleştirilmiştir. Sözdizimi geçersiz ve derleme yapmıyor. Ve sonuç olarak, hedef, extrictFactory ile yapılması gereken AngularFire'dan döndürülen senkronize diziye bir arama yöntemi eklemektir.

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)); 
    }; 
}); 
İlgili konular