AngularFire — вложенные запросы Firebase не работают

У меня есть следующий код в контроллере:

FirebaseService.$child('tasks').$on('loaded', function(tasks) {
    console.log('tasks loaded');
    FirebaseService.$child('taskTemplates').$on('loaded', function(taskTemplates) {
        console.log('taskTemplates loaded');
    });
});

Консоль показывает только tasks loaded, а второй console.log никогда не выполняется. Если я запрашиваю эти дочерние элементы последовательно (запрос для taskTemplates не находится в загруженном обратном вызове), он работает без проблем. Есть ли причина такого странного поведения?

Немного справочной информации: Когда задачи загружены, мне нужно что-то с ними проверить и в некоторых случаях — и только тогда — я хочу загрузить шаблоны задач.

Вот мой FirebaseService, если это полезно:

app
.value('FIREBASE_URL', 'XXXXXXXXXXXX.firebaseIO.com/')
.service('FirebaseService', function($firebase, FIREBASE_URL) {
    return $firebase(new Firebase(FIREBASE_URL));
});

Большое спасибо за Вашу помощь!


person amann    schedule 08.03.2014    source источник
comment
Зачем заморачиваться с вложенным вызовом load? Когда родительские данные загружаются, они уже содержат все дочерние элементы, поэтому дочерние уже загружены.   -  person Kato    schedule 09.03.2014
comment
Что ж, tasks является родным братом taskTemplates — тогда это все еще применимо?   -  person amann    schedule 09.03.2014
comment
Я неправильно понял, думая, что вы вызываете $child для объекта tasks. Вопрос снят!   -  person Kato    schedule 10.03.2014


Ответы (1)


Мое первое подозрение заключалось в том, что эта ошибка похожа на эту серию ошибок, одна из которых который загружается только один раз, если он объявлен после начальной загрузки. Поскольку FirebaseService вызывает $firebase по родительскому пути, все дочерние данные уже кэшируются локально, что может привести к синхронному запуску события loaded (возможно, до того, как вы подключите свой прослушиватель и, таким образом, вызовете ошибку, указанную выше).

Однако мне не удалось воспроизвести поведение, показанное выше, в версиях angularFire 0.6.0, 0.7.0 или последней основной ветке. Вот моя реплика:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title></title>
    <script src="http://cdn.firebase.com/js/client/1.0.6/firebase.js"></script>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.js"></script>
    <script src="https://cdn.firebase.com/libs/angularfire/0.7.0/angularfire.min.js"></script>
</head>
<body ng-app="app" ng-controller="ctrl">

<ul>
    <li ng-repeat="log in logs">{{log}}</li>
</ul>

<script type="text/javascript">
    angular.module('app', ['firebase']).controller('ctrl', function($firebase, $scope) {
        $scope.logs = [];
        var fb = new Firebase('https://kato-sandbox.firebaseio-demo.com/');
        var ref = new $firebase(fb);
        var childA = ref.$child('alpha');
        childA.$on('loaded', function() {
            $scope.logs.push('alpha loaded');
            var childB = ref.$child('bravo');
            childB.$on('loaded', function() {
                $scope.logs.push('bravo loaded');
            })
        })
    });
</script>
</body>
</html>

Надеюсь, это поможет вам сузить масштаб ошибки, хотя само по себе это не решение.

person Kato    schedule 10.03.2014