Запрос на сортировку даты, которая находится внутри другого объекта в firebase - PullRequest
0 голосов
/ 08 июня 2018

Я разрабатываю чат в angularjs, где у меня есть вид списка чата и вид чата.

Я пытаюсь отсортировать список чата, чтобы показать самый последний чат сверху, используяFirebase и JS, я провел свое исследование, но все вопросы, которые я обнаружил, имеют дату непосредственно в детстве, но внутри моей БД моя дата находится внутри ключа 'lastMessage'.Мои даты имеют следующий формат.

date: 1528417493034

Любая помощь будет принята с благодарностью

Моя структура выглядит следующим образом:

"Users": {
"nCsXbTl8CcXvoviuL5Tt7kiV6Bn1" : {
      "contacts" : {
        "VN9AFnn4uXgDfoir8DWHnw54zrJ3" : {
          "email" : "test@test.com",
          "lastMessage" : {
            "date" : 1528417493034,
            "senderId" : "VN9AFnn4uXgDfoir8DWHnw54zrJ3",
            "status" : "success",
            "text" : "Yes?",
            "type" : "text",
            "uid" : "1528417493034VN9AFnn4uXgDfoir8DWHnw54zrJ3"
          },
          "name" : "test"
        },
        "cHuR26YaSgbO7ahSVLg1XG5HYer2" : {
          "email" : "aaa@aaa.com",
          "lastMessage" : {
            "date" : 1528417068249,
            "senderId" : "cHuR26YaSgbO7ahSVLg1XG5HYer2",
            "status" : "success",
            "text" : "Trigeeeers?",
            "type" : "text",
            "uid" : "1528417068249cHuR26YaSgbO7ahSVLg1XG5HYer2"
          },
          "name" : "aaa"
        }
      }
}

Мой список чата выглядит следующим образом:

<div layout="row" class="main-chat-container" layout-wrap>
<div class="list-container" flex="30">
    <div class="chat-header">
        <p>Lista de Chats</p>
    </div>
    <div class="chats-list">
        <div class="chats-header">
            <p>Usuarios</p>
        </div>
        <div class="chats" ng-repeat="chat in chats">
            <div class="email-container" ng-click="setUserData(chat)" ng-class="styleData.email == chat.email ? 'new-background' : ''">
                <a>{{chat.email}}</a> <p ng-show="counter > 1">{{testData.number}}</p>
            </div>
        </div>
    </div>
</div>
<div class-"chat-container" flex="70">
    <ui-view></ui-view>
</div>

И контроллер следующий

app.controller('chatController', function (currentAuth, $scope, $firebaseArray, $firebaseObject) {

$scope.chats = [];

$scope.getContactsList = function(){
    var listRef = firebase.database().ref('Users').child(currentAuth.uid).child('contacts');
    var test = firebase.database().ref('Users').child(currentAuth.uid).child('contacts');
    var listArray = $firebaseArray(listRef);
    var testArray = $firebaseArray(test);
    $scope.chats = listArray;

    console.log("TEST ARRAY IS ");
    console.log(testArray);



}

$scope.getContactsList();
});

1 Ответ

0 голосов
/ 08 июня 2018

Чтобы пользователи контактировали по метке времени своего последнего сообщения, вы должны сделать что-то вроде этого:

var userRef = firebase.database().ref('Users').child(currentAuth.uid)
var contactsQuery = userRef.child('contacts').orderByChild("lastMessage/date");

Обратите внимание, что это даст вам контакты в хронологическом порядке, поэтому вам придетсяобратный результат в вашем клиенте.

В качестве альтернативы некоторые люди хранят инвертированное значение в отдельном свойстве в своей базе данных, например,

    "VN9AFnn4uXgDfoir8DWHnw54zrJ3" : {
      "email" : "test@test.com",
      "lastMessage" : {
        "date" : 1528417493034,
        "invertedDate" : -1528417493034,
        "senderId" : "VN9AFnn4uXgDfoir8DWHnw54zrJ3",

Поскольку это invertedDate значение инвертировано, заказ этого свойства даст вам контакты вобратный хронологический порядок, чтобы вам не приходилось менять их в клиенте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...