2013-12-05 3 views
0

У меня нет проблем при использовании неявных обновлений (angelFire). Однако мне нужно, чтобы некоторые из моих данных использовали явное обновление. Поэтому я применил angelFireCollection в том же репертуаре, что и раньше, но, несмотря на то, что console.log явно сказал, что чтение было предоставлено, и попробовал его с обоими onloadcallback и без него, я не получаю данные непосредственно в назначенной переменной И один раз обратный вызов срабатывает, я получаю странно выглядящий объект, который содержит данные, но не в ожидаемой форме. Моя переменная области заканчивается пустой коллекцией. Никогда не заселяется. Вот код:angularFireCollection не возвращает никаких данных

var streamController = function ($rootScope, $scope, $log, $location, angularFireCollection, profileService) { 
    //Wait for firebaseLogin... 
    $rootScope.$watch('firebaseAuth', init);  

    function init() { 
     if ($rootScope.firebaseAuth == false) { 
      return 
     };  
     var refUsers = new Firebase($rootScope.FBURL+'/users/'+$rootScope.uid); 
     $scope.profile = angularFireCollection(refUsers, function onload(snapshot) { 
      console.log(snapshot)     
     }); 

    }; 
    }; 

    myApp.gwWebApp.controller('StreamController', ['$rootScope', '$scope', '$log', '$location', 'angularFireCollection', 'profileService', 
    streamController]); 

}());

Вот что console.log выглядит (то есть, то, что снимок выглядит):

>snapshot 
T {z: R, bc: J, V: function, val: function, xd: function…} 

Вот раньше сообщение до того, как снимок был возвращен:

Firebase Login Succeeded! fbLoginController.js:16 
FIREBASE: Attempt to read /users/529ccc5d1946a93656320b0a with auth={"username":"[email protected]","id":"529ccc5d1946a93656320b0a"} firebase.js:76 
FIREBASE: /: "auth.username == 'admin'" firebase.js:76 
FIREBASE:  => false firebase.js:76 
FIREBASE: /users firebase.js:76 
FIREBASE: /users/529ccc5d1946a93656320b0a: "auth.id == $user" firebase.js:76 
FIREBASE:  => true firebase.js:76 
FIREBASE: 
FIREBASE: Read was allowed. 

и, наконец, требуемое связывание, которое заканчивается пустым массивом: снова с консоли:

$ scope.profile []

Кто-нибудь знает, что я мог делать неправильно? Это похоже на 5 строк кода. Разочарование.

Я положил стопы в заводской функции angelFireCollection и может видеть, что данные добавляются в коллекцию в обратных вызовах внутри этой функции, но моя привязанная переменная никогда не обновляется.

ОБНОВЛЕНИЕ ОК, экспериментируя с plnkr. Кажется, что angularFireCollection ОЖИДАЕТ ваш возврат СПИСОК элементов. Снимок возвращается правильно, если вы проверите snapshot.val(), это будет какая-либо структура объекта, хранящаяся в firebase. ЕСЛИ вы используете angularFireCollection, он действительно связывается с переменной HOWEVER, превращая объект, не являющийся списком, в искаженный беспорядок, и вы не можете получить доступ к объекту, пользователю обычного оператора точки. Это либо ошибка, либо это серьезное ограничение angularFireCollection, которое заставит меня переоценить, насколько легко я могу использовать firebase в качестве бэкэнд. Я не могу поделиться своим plnkr, потому что он обращается к непубличным данным, но завтра, если у меня будет время, я создам публичную firebase с хранилищем объектов и продемонстрирую.

ответ

0

Ok. Таким образом, похоже, что angularFireCollection является MEANT, чтобы быть основанным на массиве. Это нормально. Было бы очень полезно, если бы была обновлена ​​документация на angularFire, чтобы это было ясно. Таким образом, это не явный метод явного обновления.

Для явного подхода, основанного на не-массиве, я привел следующий код. Если бы я не был введен в заблуждение по документации, я бы пошла по этому пути изначально.

var MainCtrl = function($scope, angularFire) { 
    $scope.test = {}; 
    var _url = 'https://golfwire.firebaseio.com/tmp'; 
    var _ref = new Firebase(_url); 
    var promise = angularFire(_ref, $scope, 'implicit'); 
    promise.then (function(data){ 
     $scope.explicit=angular.copy($scope.implicit); 
    }); 
} 

Затем работать локально с «явной» копии и когда готовы просто обновить «неявное» путем присвоения: $ scope.implicit = $ scope.explicit.

Вот plnkr: http://plnkr.co/edit/bLJrL1

+0

Вы можете следить за v2. http://angularfire.com/documentationv2.html В настоящее время он находится в стадии rc, но он чувствует себя более прозрачным.Он всегда возвращает объекты и имеет встроенный фильтр orderByPriority для создания массивов для таких вещей, как ng-repeat. – Bro

Смежные вопросы