2013-12-15 10 views
7

Voglio chiamare una funzione una volta che ho recuperato i miei dati firebase, tuttavia, non vedo alcuna funzione promesse come quella dell'oggetto ref. Qualche suggerimento? Ecco il mio codice:angularfire, richiamata sui dati recuperati

angular.module('myMod', ['firebase']).controller('myCtrl', ['$scope', '$firebase', 
    function($scope, $firebase) { 
     var ref = new Firebase('myfirebaseurl'); 

     $scope.data = $firebase(ref); 

     // i want to do something like 
     data.then(function(){ 
      someFunc(); 
     }); 

     // or something like 
     $scope.$watch('data', function(){ 
      if($scope.data.desiredProperty) { 
       doSomething(); 
      } 
     }); 
    }]); 
+0

sono stato in grado di usare setTimeout per eseguire la mia funzione dopo un certo punto, però non credo che questo sia un buona soluzione dal momento che i dati possono scendere in diversi punti. – Conqueror

risposta

0

AngularFire fornisce gestori di eventi per gli eventi "caricati" e "modificati". Dal annotated source:

object.$on = function(type, callback) { 
    switch (type) { 
    case "change": 
    self._onChange.push(callback); 
    break; 
    case "loaded": 
    self._onLoaded.push(callback); 
    break; 
    default: 
    throw new Error("Invalid event type " + type + " specified"); 
    } 
}; 

Così si dovrebbe essere in grado di fare qualcosa del genere:

var ref = new Firebase('myfirebaseurl'); 

$scope.data = $firebase(ref); 

$scope.data.$on('loaded', function(){ 
    if($scope.data.desiredProperty) { 
     doSomething(); 
    } 
}); 

Edit:

Sembra che quando l'evento AngularFire loaded attiva, l'oggetto $scope.data non è ancora completamente popolato. Questo sembra essere un problema noto, ma ci sono alcuni modi per aggirarlo.

accedere ai dati come parametro per la funzione loaded callback:

$scope.data.$on("loaded", function(data) { 
    console.log(data); 
} 

Skip AngularFire del tutto e ha colpito l'API Firebase direttamente:

ref.on("value", function(data) { 
    console.log(data.val()); 
} 
+0

questa soluzione non ha funzionato per me, la funzione $ on non è stata riconosciuta sull'oggetto ref. – Conqueror

+0

Interessante, mi chiedo se si tratta di un problema di versione o qualcosa nei dati di Firebase che non corrisponde alle tue aspettative. Ho un esempio funzionante in [questo Plunk] (http://plnkr.co/edit/JXweU5?p=preview) nel caso in cui aiuta. Puoi provare a sostituire lentamente i bit fino a quando non si rompe per individuare il problema. – ajk

+0

La funzione on sembra sparare ma se provo per una proprietà sui dati, diciamo, x (che si riflette nella struttura db) torna sempre undef. – Conqueror

0

È necessario utilizzare una combinazione di $ caricato e $ watch promette di elaborare i dati restituiti da Firebase. Per ulteriori informazioni si prega di consultare AngularFire Documentation.

Provare il seguente codice se i dati sono un oggetto. Guardare i cambiamenti nelle collezioni è un po 'diverso, ma fondamentalmente lo stesso.

angular.module('myMod', ['firebase']) 
    .controller('myCtrl', ['$scope', '$firebase', function ($scope, $firebase) { 

    var data = $firebase(new Firebase(URL)); 

    //to take an action after the data loads, use the $loaded() promise 

    data.$loaded.then(function() { 
     console.log("loaded record:", data.$id, data.otherData); 
     someFunc(); 

    //Register an event listener which will be notified any time there is a change to the data. 

     data.$watch(function (event) { 
      console.log(event); 
      if (data.desiredProperty) { 
       doSomething(); 
      } 
     }); 
    }); 

    //For three-way data bindings, bind it to the scope instead 

    data.$bindTo($scope, "data"); 
}]); 

solito finiscono utilizzando parte del legame AngularFire e mescolare con le modalità previste con il nucleo Firebase SDK.

2

Ho sprecato un bel po 'di tempo cercando di fare tutto con Angularfire quando in realtà la maggior parte della funzionalità di Firebase è più facilmente implementabile senza di essa.

di fare ciò che si richiede, vorrei suggerire quanto segue:

var ref = new Firebase('myfirebaseurl'); // get your ref 

// Called once with the initial data and again every time the data changes 
ref.on("value", function(data) { 
    $scope.data = data.val(); 
    someFunc(); 
}); 

Il codice di cui sopra soddisfa il vostro bisogno. Verrà richiamato una volta quando vengono recuperati i dati e nuovamente ogni volta che i dati vengono aggiornati. Se si desidera solo per chiamare la funzione per la prima volta i dati vengono caricati è possibile utilizzare:

ref.once("value", function(data) { ... }); 
Problemi correlati