2016-12-26 199 views
1

我與火力地堡查詢掙扎,我有這個廠:火力地堡查詢在工廠

.factory("usuariosFac", ["$firebaseArray","$q","$firebaseObject", 
    function($firebaseArray,$q,$firebaseObject) { 
     return { 

     getByEmail: function(email){ 
      var ref = firebase.database().ref("usuarios"); 
      var query=ref.orderByChild("email").equalTo(email).on("child_added", function(data) { 
      console.log(data.val()); 
      return data.val(); 
      }); 
     } 
     } 

    } 
]) 

此功能是在我的控制器:

$scope.findUser = function() { 
    $scope.usuario=usuariosFac.traeGrupoPorEmail($scope.formLogin.usuario); 
}; 

當我運行控制檯登錄在工廠內打印罰款。但$scope.usuario是未定義的,這是爲什麼?

+0

哪裏函數'traeGrupoPorEmail'從何而來? –

回答

1

但是$scope.usuario是未定義的,這是爲什麼?

該回調函數被稱爲異步嵌套的函數中的return語句不會將值返回給父函數。

相反,創建並返回一個承諾:

app.factory("usuariosFac", ["$firebaseArray","$q","$firebaseObject", 
    function($firebaseArray,$q,$firebaseObject) { 
     return { 

     getByEmail: function(email){ 
      //Create defer object 
      var future = $q.defer(); 
      var ref = firebase.database().ref("usuarios"); 
      var query=ref.orderByChild("email") 
      .equalTo(email) 
      .once("child_added", 
       function onSuccess(data) { 
        console.log(data.val()); 
        //RESOLVE 
        future.resolve(data.val()); 
       }, 
       function onReject(error) { 
        //OR REJECT 
        future.reject(error); 
       } 
      ); 
      //RETURN promise 
      return future.promise; 
     } 
     } 

    } 
]) 

在控制器方面,利用返回的承諾的.then方法:

$scope.findUser = function() { 
    var promise = usuariosFac.traeGrupoPorEmail($scope.formLogin.usuario); 
    promise.then(function onSuccess(data) { 
     $scope.usuario = data; 
    }).catch(function onReject(error) { 
     console.log(error); 
     throw error; 
    }); 
}; 
+0

謝謝,正在完美工作。我認爲「一次」功能就是這樣做的。 –