【RequireJS】【BackboneJS】【HighchartsJS】backboneJSでhighchartsJSを使う‐その2

【RequireJS】【BackboneJS】【HighchartsJS】backboneJSでhighchartsJSを使う‐その2

前回記事の続きです。
【RequireJS】【BackboneJS】【HighchartsJS】backboneJSでhighchartsJSを使う‐その1

前回はhighchartsに固定値を設定してViewでそのまま画面に表示させるようにしていましたが、今回はbackboneのCollectionを使ってサーバから取得した情報をhighchartsのデータとして使用して画面に表示させるようにしたいと思います。

前提

ディレクトリ構成

サーバ側情報 (Hello)

REST URL

curl -X GET http://localhost:3000/hello

取得データ

{
  "hello": {
    "text": "Hello World Backbone Fetch!!"
  }
}

サーバ側情報 (HelloValue)

REST URL

curl -X GET http://localhost:3000/helloValue

取得データ

{
  "helloValue": [
      {
          "num":0.5
      },
      {
          "num":1.5
      }
  ]
}

requireJS+backboneJS+highchartsJS

index.html

<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <script src="https://requirejs.org/docs/release/2.3.6/minified/require.js"></script>
        <script src="./js/config/config.js"></script>
        <script src="./js/views/HelloWorldView.js"></script>
        <script type="text/template" id="hello-template">
            <h2><%= text %></h2>
        </script>
        <h1>Hello World!</h1>
        <div class="hoge"></div>
        <div id="container"></div>
    </body>
</html>

hogeクラスとcontainerIDが付与されているdevタグをそれぞれ作成しておきます。
hogeにModelの内容が入ります。
containerにグラフが描画されます。

config.js

require.config({
    packages: [{
        name: 'highcharts',
        main: 'highcharts'
    }],
    baseUrl: "js",
    paths: {
        "backbone" : "lib/backbone",
        "jquery" : "lib/jquery",
        "underscore" : "lib/underscore",
        //'highcharts': 'https://code.highcharts.com'
        "highcharts": "lib"
    },
    shim: {
        'backbone' : {
            deps: ['underscore', 'jquery'],
            exports: 'Backbone'
        }
    }
});

backboneJSとhighchartsJSの読み込み設定を行なっています。
highchartsのpaths設定でURLの方がコメントアウトされていますが、インターネット上のファイルを使用したい場合はURL指定でも行けるよという意味で一応記載してみました。

HelloWorldModel.js

define(['backbone'], function(backbone) {

    var HelloWorldModel = backbone.Model.extend({
        url: "http://localhost:3000/hello",
        defaults: {
            "text":"Hello World Backbone!!"
        },
        read: function(){
            this.fetch()
        }
    });
    return HelloWorldModel;
});

fetchが成功すると、textが「Hello World Backbone fetch!!」に上書きされます。

HelloWorldCollection.js

define(['backbone'], function(backbone) {

    var HelloWorldCollection = backbone.Collection.extend({
        url: "http://localhost:3000/helloValue",
        defaults: {
            "text":"Hello World Backbone!!"
        },
        read: function(){
            this.fetch()
        }
    });
    return HelloWorldCollection;
});

helloValueのfetchで取得するデータが配列となるので、backboneのCollectionを使います。
Collectionの各要素にnumというフィールドが生成されることになります。

HelloWorldView.js

require(['backbone', 'model/HelloWorldModel', 'collection/HelloWorldCollection', 'highcharts'],
function(backbone, helloWorldModel, helloWorldCollection, hi) {

    var model = new helloWorldModel();
    var collection = new helloWorldCollection();

    var HelloWorldView = backbone.View.extend({
        el: $('.hoge'),
        initialize: function() {
            model.read();
            this.listenToOnce( model, 'sync', this.render);
            collection.read();
            this.listenToOnce( collection, 'sync', this.graph);
        },
        render: function() {
            $(this.el).html(_.template($('#hello-template').text())({ "text": model.get("text") }));
        },
        graph: function() {
            hi.chart('container', {
                chart: {
                    renderTo: 'chart',
                    type: 'bar'
                },
                title: {
                    text: 'Hello Highcharts'
                },
                xAxis: {
                    categories: ['Hello', 'World']
                },
                yAxis: {
                    title: 'Value'
                },
                series: [{
                    name: 'Highcharts Intro',
          	         data: [collection.at(0).get('num'), collection.at(1).get('num')]
                }]
            });
        }
    });
    new HelloWorldView();
});

  1. modelのreadを呼び出し、サーバから情報を取得する
  2. listenToOnceでmodelの状態を監視し、modelが変化したタイミングでViewのrenderを呼び出す
  3. readした時点でmodelのtextが上書きされ、modelの状態が変わったためrenderが呼び出され、templateが画面に挿入される
  4. collectionのreadを呼び出し、サーバから配列情報を取得する
  5. listenToOnceでcollectionの状態を監視し、collectionが変化したタイミングでViewのgraphを呼び出す
  6. readした時点でcollectionにnumが生成され、collectionの状態が変わったためgraphが呼び出され、highchartsのグラフが画面に描画される

表示

棒グラフの数値がサーバから取得したデータになっていることが分かります。

まとめ

今まで使ったrequireJS、backboneJS、highchartsJSとサーバ取得の機能全部乗せなまとめ的HelloWorldでした。

javaScriptカテゴリの最新記事