Считывает данные из Firebase и добавляет их в область видимости

#angularjs #firebase #angularfire

#angularjs #firebase #angularfire

Вопрос:

Для приложения RSS я хочу прочитать массив объектов JSON (каждый из которых представляет параметры отдельного канала) из Firebase.

Без Firebase приложение работает на основе объявления

 $scope.rssSourcesTest = [
    {'aid': 'urlaub99euro', 'atitle': 'Urlaub99Euro', 'aurl': 'http://www.urlaub99euro.de/rss3b/', 'atags': 'deutschland'},
    {'aid': 'urlaub_fm', 'atitle': 'urlaub.fm', 'aurl': 'http://urlaub.fm/rss/', 'atags': ''}
    ];
  

Запись $scope.rssSourcesTest в Firebase работает. Чтение массива обратно также работает, но я не могу присвоить результирующий массив rssSources2 переменной области видимости, такой как $scope.rssSources2 .

Я прочитал здесь много статей об этом, решение может включать $timeout или $apply(). Вот тест.

         // Test Read rssSources from Firebase ************************

    // Test Array
    $scope.rssSourcesTest = [
    {'aid': 'urlaub99euro', 'atitle': 'Urlaub99Euro', 'aurl': 'http://www.urlaub99euro.de/rss3b/', 'atags': 'deutschland'},
    {'aid': 'urlaub_fm', 'atitle': 'urlaub.fm', 'aurl': 'http://urlaub.fm/rss/', 'atags': ''}
    ];
    // console.log($scope.rssSourcesTest[0].aid);
    // works!

    // write
    var sourcesFB = new Firebase("https://xxxxxxxx.com/sourcestest");
    sourcesFB.set($scope.rssSources);
    // works

    // read
    var rssSourcesRef = new Firebase("https://xxxxxxxx.com/sourcestest/");
    rssSourcesRef.on('value', function(snap) {
            rssSources2 = snap.val();
            console.log("read from FB data ..: "   rssSources2[0].aid);
            // works
    });
    console.log($scope.rssSources2[0].aid);
    // is $scope.rssSources2 is undefined

    // /Test Read rssSources from Firebase ************************
  

Ответ №1:

$scope.rssSources2 и rssSources2 — это две разные переменные. Заменить:

 rssSources2 = snap.val();
  

с:

 $scope.rssSources2 = snap.val();
  

Комментарии:

1. Частично исправлено. Все равно нужно использовать $timeout или $scope. $digest() для вызова грязной проверки и компилятора, иначе изменения не будут отображаться до следующего события дайджеста.

2. Большое спасибо за ответ (хотя это было ясно) и комментарий. по какой-то причине $timeout не сработал, он выдал ошибку с undefined в console.log. Вставка строки $scope.$digest(); решила всю проблему — спасибо Като. var rssSourcesRef = new Firebase(» xxxxxx.com/sources /» ); rssSourcesRef.on(‘значение’, функция (моментальный снимок) { // $timeout(функция() { $scope.rssSources = snapshot.val(); // }) $scope.$digest(); console.log(«чтение из данных FB ..: » $scope.rssSources[1].aid); // работает });