Backgridを試してみる

2013-03-09T00:00:00+00:00 Backbone.js JavaScript

http://wyuenho.github.com/backgrid が気になったので使ってみた

動作概要的なのとして、Google AnalyticsからダウンロードしたCSVファイルをサーバーからJSONで吐き出して処理する(Google API Client Libraryを使えばサーバー無しでも可能だと思うけど)

んでインストールする訳だが上記のリンク先(github)からダウンロードする。で必要なのが

  • jquery.js
  • underscore.js
  • backbone.js
  • backbone-pageable.js (assetsディレクトリに入ってる)
  • backgrid.js
  • backgrid.css
  • backgrid-paginator.js (lib/extensionディレクトリ辺りに入ってる)
  • backgrid-paginator.css (上と同じ)

んまぁページング機能を使わないならソレ系のは要らないけど...

でまぁHTML側は以下みたいになる

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <link rel="stylesheet" type="text/css" href="/static/css/backgrid.css" />
    <link rel="stylesheet" type="text/css" href="/static/css/backgrid-paginator.css" />
    <script type="text/javascript" src="/static/js/jquery.js"></script>
    <script type="text/javascript" src="/static/js/underscore.js"></script>
    <script type="text/javascript" src="/static/js/backbone.js"></script>
    <script type="text/javascript" src="/static/js/backbone-pageable.js"></script>
    <script type="text/javascript" src="/static/js/backgrid.js"></script>
    <script type="text/javascript" src="/static/js/backgrid-paginator.js"></script>
  </head>
  <body>
    <div id="grid"></div>
    <script type="text/javascript" src="app.js"></script>
  </body>
</html>

あとはがっつりapp.jsを書くだけ。サーバー側な所は省略

var Sample = Backbone.Model.extend({});

/* Backbone.PageableCollectionを使うので今回は要らない
var Samples = Backbone.Collection.extend({
  model: Sample,
  url: "/fetch/samples"
});
*/

var Samples = Backbone.PageableCollection.extend({
  model: Sample,
  url: "/fetch/samples",
  state: {
    pageSize: 20
  },
  mode: "client" // infiniteとか色々ある模様。infiniteにした場合はurl先にクエリーがついてちょこちょこデータをロードする形式が採用できるのかも(未検証)
});

var View = Backbone.View.extend({
  el: $("#grid"),
  render: function() {
    var samples = new Samples();

    var grid = new Backgrid.Grid({
      collection: samples, // Backgridでレンダリングするコレクション(インスタンス)を指定
      columns: [
        {
          name: "id",
          label: "ID",
          cell: "integer",
          editable: false
        },
        {
          name: "count",
          label: "アクセス数",
          cell: "integer",
          editable: false
        },
        {
          name: "title",
          label: "タイトル",
          cell: "string"
        }
      ],
      footer: Backgrid.Extension.Paginator // フッターにBackgridのPaginatorを設定
    });

    this.$el.append(grid.render().$el);

    samples.fetch();
  }
});

new View().render();

な感じ。ちなみに

grid.on("rendered", function() {
  // 省略
});

な事も出来る模様。で実際に見ると

てな感じ。で曖昧な点として

  • mode: "infinite"した場合
  • editableで編集出来るデータを編集した場合にサーバーとかにsync(update)なやつとか出来ないのかっていう点

FuelPHPのエラー処理の雑多メモ chrome.appなPattern&Practice