2015-10-30 57 views
0

目前我正在使用此片段爲我的firebase數據庫中的每一天設置6天和一些時段。如何更改存儲在Firebase中的數據的順序?

fb.$set({ 
    monday: { 
    name: 'Monday', 
    slots: { 
     900: { 
     time: '9:00am', 
     booked: false 
     }, 
     0110: { 
     time: '11:00am', 
     booked: false 
     }, 
     100: { 
     time: '1:00pm', 
     booked: false 
     }, 
     300: { 
     time: '3:00pm', 
     booked: false 
     }, 
     500: { 
     time: '5:00pm', 
     booked: false 
     }, 
     700: { 
     time: '7:00pm', 
     booked: false 
     } 
     } 
    }, 
    tuesday: { 
    name: 'Tuesday', 
    slots: { 
     900: { 
     time: '9:00am', 
     booked: false 
     }, 
     0110: { 
     time: '11:00am', 
     booked: false 
     }, 
     100: { 
     time: '1:00pm', 
     booked: false 
     }, 
     300: { 
     time: '3:00pm', 
     booked: false 
     }, 
     500: { 
     time: '5:00pm', 
     booked: false 
     }, 
     700: { 
     time: '7:00pm', 
     booked: false 
     } 
     } 
    }, 
    wednesday: { 
    name: 'Wednesday', 
    slots: { 
     900: { 
     time: '9:00am', 
     booked: false 
     }, 
     0110: { 
     time: '11:00am', 
     booked: false 
     }, 
     100: { 
     time: '1:00pm', 
     booked: false 
     }, 
     300: { 
     time: '3:00pm', 
     booked: false 
     }, 
     500: { 
     time: '5:00pm', 
     booked: false 
     }, 
     700: { 
     time: '7:00pm', 
     booked: false 
     } 
     } 
    }, 
    thursday: { 
    name: 'Thursday', 
    slots: { 
     900: { 
     time: '9:00am', 
     booked: false 
     }, 
     0110: { 
     time: '11:00am', 
     booked: false 
     }, 
     100: { 
     time: '1:00pm', 
     booked: false 
     }, 
     300: { 
     time: '3:00pm', 
     booked: false 
     }, 
     500: { 
     time: '5:00pm', 
     booked: false 
     }, 
     700: { 
     time: '7:00pm', 
     booked: false 
     } 
     } 
    }, 
    friday: { 
    name: 'Friday', 
    slots: { 
     900: { 
     time: '9:00am', 
     booked: false 
     }, 
     0110: { 
     time: '11:00am', 
     booked: false 
     }, 
     100: { 
     time: '1:00pm', 
     booked: false 
     }, 
     300: { 
     time: '3:00pm', 
     booked: false 
     }, 
     500: { 
     time: '5:00pm', 
     booked: false 
     }, 
     700: { 
     time: '7:00pm', 
     booked: false 
     } 
     } 
    }, 
    saturday: { 
    name: 'Saturday', 
    slots: { 
     900: { 
     time: '9:00am', 
     booked: false 
     }, 
     0110: { 
     time: '11:00am', 
     booked: false 
     }, 
     100: { 
     time: '1:00pm', 
     booked: false 
     }, 
     300: { 
     time: '3:00pm', 
     booked: false 
     }, 
     500: { 
     time: '5:00pm', 
     booked: false 
     }, 
     700: { 
     time: '7:00pm', 
     booked: false 
     } 
     } 
    } 
}); 

請注意訂單。那麼爲什麼它按字母順序存儲?

database order

這便成爲一個問題,當我回到這個數據並逐一在頁面上爲天都沒有在你所期望的,但按字母順序返回的順序。

有沒有一種方法可以對此有一定程度的控制?

+1

爲什麼不讓它們在使用'orderBy'過濾器時在UI上排序呢? –

+1

https://www.firebase.com/docs/rest/guide/retrieving-data.html#section-rest-過濾檢查警告!檢查這個答案,http://stackoverflow.com/questions/31808990/firebase-returning-keys-of-child-node-in-different-orders-on-different-devices-a –

+0

是有幫助的!謝謝 – Smiter

回答

0

Firebase數據庫存儲JSON數據。 JSON對象中的鍵本質上是無序的。在大多數情況下,Firebase SDK會默認按字母順序返回密鑰。

一般火力地堡建議不要使用數組,但如果這種情況是例外到一般建議你可以這樣做:

set({ 
    1: { 
    name: 'Monday', 
    slots: { 
     900: { time: '9:00am', booked: false }, 
     1100: { time: '11:00am', booked: false }, 
     1300: { time: '1:00pm', booked: false }, 
     1500: { time: '3:00pm', booked: false }, 
     1700: { time: '5:00pm', booked: false }, 
     1900: { time: '7:00pm', booked: false } 
    } 
    }, 
    2: { 
    name: 'Tuesday', 
    slots: { 
     900: { time: '9:00am', booked: false }, 
     1100: { time: '11:00am', booked: false }, 
     1300: { time: '1:00pm', booked: false }, 
     1500: { time: '3:00pm', booked: false }, 
     1700: { time: '5:00pm', booked: false }, 
     1900: { time: '7:00pm', booked: false } 
    } 
    }, 
    3: { 
    name: 'Wednesday', 
    slots: { 
     ... 

在上面的代碼中我也改變了slots的鑰匙。通過使用24小時符號,他們將自動按照您希望的方式進行訂購。

+0

謝謝弗蘭克,這是我有使用!不是非常可擴展的,但當我到達時會穿過那座橋:) – Smiter

0

您需要將一個函數傳遞給orderBy過濾器,該過濾器將執行您的自定義排序。

var myApp = angular.module('myApp',[]); 
 

 
function MyCtrl($scope) { 
 
    $scope.name = 'Superhero'; 
 
    
 
    $scope.days = [ 
 
     { name: 'Monday' }, 
 
     { name: 'Tuesday' }, 
 
     { name: 'Wednesday' }, 
 
     { name: 'Thursday' }, 
 
     { name: 'Friday' }, 
 
     { name: 'Saturday' }, 
 
     { name: 'Sunday' } 
 
    ] 
 
    
 
    $scope.sortByWeekday = function (day) { 
 
     var weekdays = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']; 
 
     return weekdays.indexOf(day.name.toLowerCase()); 
 
    } 
 
}
<html> 
 
    <head> 
 
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
    </head> 
 
    <body ng-app="myApp"> 
 
    <div ng-controller="MyCtrl"> 
 
     <div ng-repeat="day in days | orderBy:sortByWeekday">{{day.name}}</div> 
 
    </div> 
 
    </body 
 
</html>

+0

對不起Phuzi我喜歡這個答案,但它不會堅持。當我重置應用程序的日子出現在正確的順序,他們立即被替換的命令來自FB :( – Smiter

+0

@Smiter怪異的,必須是其他更新視圖。 – phuzi

0

我認爲你正在尋找$優先權。在Firebase中訂購數據首先按$優先完成,然後按鍵完成。在Firebase中有大量關於how sorting works的文檔可供您閱讀。如果您試圖以預定順序專門存儲數據(並將其取回),那麼我會使用$ priority。

0

我上面發表了一條評論,不知道項目的範圍,很難知道推薦的確切方向。但是,使用日期名稱作爲關鍵字並將時間存儲爲字符串可能不會長期有效。

簡單的答案是將時間段/事件的日期和時間作爲時間戳存儲,格式爲YYYYmmddHHMMSS,作爲插槽的子節點。

因此,例如

training_classes 
    training_id_1234 
    timestamp: 20151031130000 
    trainer: trainer_id1234 
    client: client_id1234 
    comment: "Algebra 1" 
    training_id_3445 
    timestamp: 20151031150000 
    trainer: trainer_id1234 
    client: client_id1234 
    comment: "Algebra 2" 

採用這種結構,可以方便地查詢上週六10月31日的所有類。在上面的例子中,有兩個,一個在下午1點,另一個在下午3點。

其他時間沒有數據,因此可以在Firebase中預訂這些數據(無需存儲預訂:false)。

您還可以輕鬆地對它們進行排序,因爲時間戳總是按時間順序排列 - 它存儲在Firebase中的順序無關緊要。

此外,它使改變培訓活動超級簡單。只需更新時間戳和whammo,它就會被重新安排。

相關問題