【问题标题】:How do I make a simple d3 chart with Firebase data?如何使用 Firebase 数据制作简单的 d3 图表?
【发布时间】:2016-01-07 07:28:42
【问题描述】:

我正在尝试查询特定歌曲在 firebase 中记录了多少条目。换句话说,我正在尝试获取歌曲的总播放次数并将它们绘制在图表上。

我试图获取 firebase 数组的长度,但我知道我必须使用 $loaded.then(function())。我将如何在这里使用它?我的控制器:

(function () {
function MetricsCtrl($scope,$firebaseArray, Metric) {
    var firebaseRef = new Firebase("https://bloc-jams.firebaseio.com/");

    $scope.options = {...};

    var blue = $firebaseArray(firebaseRef.child('Songs').orderByChild('name').equalTo("Blue"))
    var green = $firebaseArray(firebaseRef.child('Songs').orderByChild('name').equalTo("Green"))
    var red = $firebaseArray(firebaseRef.child('Songs').orderByChild('name').equalTo("Red"))
    var pink = $firebaseArray(firebaseRef.child('Songs').orderByChild('name').equalTo("Pink"))
    var magenta = $firebaseArray(firebaseRef.child('Songs').orderByChild('name').equalTo("Magenta"))

    $scope.data = [
        {
            values: [
                {
                    "label" : "Blue" ,
                    "value" :  blue.length
                } ,
                {
                    "label" : "Green" ,
                    "value" : green.length
                } ,
                {
                    "label" : "Red" ,
                    "value" : red.length
                } ,
                {
                    "label" : "Pink" ,
                    "value" : pink.length
                } ,
                {
                    "label" : "Magenta" ,
                    "value" : magenta.length
                }
            ]
        }
    ]
}

angular
    .module('blocJams')
    .controller('MetricsCtrl', ['$scope','$firebaseArray','Metric', MetricsCtrl]);
})();

【问题讨论】:

  • 你有什么理由单独查询这些,作为一个数组?看起来$firebaseObject(firebaseRef.child('Songs')) 会更直接。此外,为了可扩展性,您可能希望提前单独编译统计信息,以便获取歌曲数量实际上不需要加载数据库中的每首歌曲。努力写入以使读取更容易。

标签: javascript d3.js firebase nvd3.js angularfire


【解决方案1】:

您的推理是正确的,您只能在加载 firebase 数组后制作图表。

如果你使用 Angular 的承诺服务 $q:

$q.all([ blue.$loaded(), 
         green.$loaded(), 
         red.$loaded(), 
         pink.$loaded(), 
         magenta.$loaded()
]).then(makeChart)

function makeChart(data) {
  // data[0] is blue, data[1] is green, etc.
  // ...
  // $scope.data = [{...}]
}

【讨论】:

  • 一个更优雅的解决方案是将数据加载到服务中,并在路由器中解析该服务,因此控制器不需要这种耦合来完成它的工作。见this answerthis doc
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多