2014-11-07 4 views
1

Довольно новый угловому & Firebase здесь, но заметил странное поведение запросов и представляя упорядоченные данные, которые не адресованы нигде еще ...Угловое ngRepeat не сохраняет порядок пунктов приоритета Firebase?

Я толкающие данные в firebase и установление приоритетов с нисходящим отрицательным значением так что новейшие данные находятся в верхней части списка.

При получении ref с child_added событиями, я могу подтвердить, что данные поступают в правильном порядке; однако при использовании с ngRepeat данные каким-то образом восстанавливаются (новейшие данные отображаются внизу списка ngRepeat).

Если я использую что-то вроде .append(), данные будут правильно упорядочены. Но скорее сделайте это «Угловым» способом с ngRepeat.

// example html binding 
// ==================================== 
<ul> 
    <li ng-repeat="(itemID, item) in list">{{itemID}}</li> 
</ul> 


// example controller code 
// ==================================== 
var laApp = angular.module('laApp', ['firebase']); 

laApp.controller('laAppCtrl', function ($scope, $timeout){ 
    var ref = new Firebase('https://ngrepeatbug.firebaseio.com'); 

    $scope.pushPriority = function(){ 
     var uid = new Date().getTime(); 
     var priority = 0 - uid; 
     // set with -priority so newest data on top 
     ref.push().setWithPriority(uid, priority); 
    } 

    $scope.list = {}; 
    ref.orderByPriority().on('child_added', function(snap){ 
     $timeout(function(){ 
      var snapID = snap.key(); 
      var snapVal = snap.val(); 

      //repeat method 
      $scope.list[snapID] = snap.val(); 

      //append method 
      $('ul.append').append("<li>" + snapVal + "</li>") 
     }) 
    }) 
}); 

Pen сравнивающего ngRepeat и присоединять методы: http://codepen.io/juddam/pen/dIiLz

Я прочитал другие решения, которые либо преобразующие $scope.list объекта в массив, который затем используется с фильтром или $ реверсивного порядком на клиенте, но это победил всю цель хранения данных по приоритету и имел простой метод для запроса и представления упорядоченных данных.

Знать orderByPriority является новым для firebase v2.0, так что интересно, если ошибка или я что-то не хватает?

+0

Объекты в javascript не имеют установленного ключевого порядка, поэтому нет способа гарантировать, какой ключ будет отображаться перед другим, не помещая их в массив и не сортируя его. –

+0

Спасибо Зак - я знал, но так как порядок отображения был последовательно в обратном порядке, может быть, не хватало чего-то другого. – juddm

ответ

1

Вы добавление детей к объекту с этим:

$scope.list[snapID] = snap.val(); 

Несмотря на то, что это выглядит, как вы добавляете в массив, вы на самом деле добавление к обычному объекту. И как @ZackArgyle говорит в своем комментарии: ключи в объекте не имеют гарантированного порядка.

Если вы хотите сохранить порядок элементов, вы должны нажать их в массив.

$scope.list.push(snap.val()); 

Это добавляет им числовые индексы, которые будут поддерживать их порядок.

Если вы хотите как поддерживать порядок позиций , так и их ключом, вам придется управлять ими в массиве.

$scope.list.push({ $id: snap.key(), value: snap.val() }); 

Этот последний подход является чрезвычайно упрощенная версия того, что делает AngularFire при вызове $asArray().

+1

Кроме того, метод игнорирует prevChild. Элементы, поступающие с сервера, также не имеют гарантированного заказа. Поэтому при использовании child_added важно также наблюдать prevChild, чтобы определить, куда они идут в массиве. Еще одна особенность привязок AngularFire. – Kato

+0

@Kato Хорошая точка. В этом контексте, используя 'orderByPriority()' и 'child_added' для загрузки начального представления. Поэтому, если полученное позднее событие child_added должно будет наблюдать prevChild. – juddm

+0

Спасибо @Frank - был бы upvote, но не хватит cred :) Это было частью более крупного сервиса, который бы собирал денормированные данные firebase.Я использую AngularFire в другом месте, но [read '$ asArray()' будет загружать все данные] (https://www.firebase.com/docs/web/libraries/angular/guide.html). Поскольку я использую его для управления и рендеринга данных изображений, он был обеспокоен перегрузкой браузера. – juddm

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