2013-12-15 12 views
7

Firebase verilerimi geri aldıktan sonra bir işlevi çağırmak istiyorum, ancak, ref nesnesi gibi herhangi bir işlev görmüyorum. Herhangi bir öneri? Benim kodum:angularfire, geri alınan veriler hakkında geri arama

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

Ben belirli bir noktadan sonra benim işlevini çalıştırmak için setTimeout kullanmak başardı, ancak bu bir olduğunu sanmıyorum Veriler farklı noktalardan gelebileceğinden iyi bir çözüm. – Conqueror

cevap

0

AngularFire, 'yüklenen' ve 'değiştirilen' olaylar için olay işleyicileri sağlar. annotated source Gönderen:

var ref = new Firebase('myfirebaseurl'); 

$scope.data = $firebase(ref); 

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

Düzenleme::

O AngularFire loaded etkinlik tetiklendiğinde benziyor, $scope.data nesne

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

Yani böyle bir şey yapmak mümkün olmalıdır henüz tamamen doldurulmadı. Bu bilinen bir sorun gibi görünüyor, ancak etrafında çalışmak için bazı yollar var.

Bağlantısı loaded geri arama işlevi parametre olarak veriler: tamamen

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

Atla AngularFire ve doğrudan Firebase API isabet:

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

Bu çözüm benim için işe yaramadı, $ on fonksiyonu ref nesnede tanınmadı. – Conqueror

+0

İlginçtir, Firebase verilerinizde bir sürüm sorunu veya beklentilerinize uymayan bir şey olup olmadığını merak ediyorum. Yardımcı olması durumunda [bu Plunk] 'da (http://plnkr.co/edit/JXweU5?p=preview) çalışan bir örneğim var. Sorunu saptamak için bitleri parçalayana kadar yavaşça değiştirmeyi deneyebilirsiniz. – ajk

+0

Ondaki işlev ateşleniyor gibi görünüyor, ancak eğer bir veriyi veri üzerinde test edersem, x diyelim ki (db yapısına yansıyan) her zaman geri gelmiyor. – Conqueror

0

Sen $ bir arada yüklenir kullanmak gerekir ve $ watch, Firebase'den döndürülen verileri işlemeye söz veriyor. Daha fazla bilgi için lütfen AngularFire Documentation'a bakın.

Verileriniz bir nesne ise aşağıdaki kodu deneyin. Koleksiyonlardaki değişikliklerin izlenmesi biraz farklı, ancak temelde aynı.

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

Genellikle bağlama AngularFire bazı kullanarak sonuna kadar ve çekirdek Firebase SDK'deki sağlanan metotlarla karıştırın.

2

Gerçekte, Firebase işlevselliğinin çoğunun daha kolay bir şekilde uygulanabildiği durumlarda, AngularFire ile her şeyi yapmaya çalışan çok büyük bir zaman harcadım.

aşağıdaki öneririm, ne gerektirir yapmak için:

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

Yukarıdaki kod ihtiyacını karşılar. Veriler alındığında ve bir kez daha veri güncellendiğinde tekrar çağrılır. Yalnızca fonksiyon verileri yüklenen ilk defa aramak istiyorsanız kullanabilirsiniz:

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