RailsでKnockout.js

44
RailsでKnockout.js 逸見 誠(@mako_wis)

Transcript of RailsでKnockout.js

Page 1: RailsでKnockout.js

RailsでKnockout.js逸見 誠(@mako_wis)

Page 2: RailsでKnockout.js

自己紹介• 逸見 誠(へんみ まこと)

• Twitter:@mako_wis

• 株式会社クレオフーガ

• フロントエンド/iOSアプリエンジニア

Page 3: RailsでKnockout.js

近況

・Knokout.js + .Net MVCでお仕事 ・フットサルしてます

Page 4: RailsでKnockout.js

勉強会スタッフ

岡山Ruby, Ruby on Rails勉強会(雑用) Okayama.rb(イベント作成係) 中国地方DB勉強会(雑用) オープンセミナー岡山(会計・雑用)

Page 5: RailsでKnockout.js

アジェンダ

Knockout.jsとは Railsに導入してみる 使うと楽できる所 使ってみた感想

Page 6: RailsでKnockout.js

Knockout.jsとは

Page 7: RailsでKnockout.js

主な特徴 ※日本語ドキュメントから引用

エレガントな依存トラッキング - データモデルが変更される度に、UIの関連付けられた部分を更新します。

宣言型 バインディング - データモデルとUIを関連付ける、シンプルで明確な方法です。複雑な動的UIも、バインディング・コンテキストを階層化させることで簡単に作成できます。

拡張が容易 - 新たなバインディングの仕組みを実装することも、最小限のコード量で実現できます。

Page 8: RailsでKnockout.js

その他のメリット ※日本語ドキュメントから引用

純粋な JavaScript ライブラリである - サーバサイド, クライアントサイドの技術を選びません。

既存のWebアプリケーションにも投入できる - アーキテクチャに大きな変更を必要としません。

コンパクト  - gzip圧縮済みであればおよそ13KB程度です。

Page 9: RailsでKnockout.js

その他のメリット ※日本語ドキュメントから引用

メインストリームのブラウザをサポート - ( IE6以降, Firefox2以降, Chrome, Safari 等 )

ビヘイビア駆動開発に向いている - ビヘイビア駆動開発(テストコードが仕様書とほぼ同義となる開発手法)を用いて、新しいブラウザやプラットフォームでの動作検証を簡略化することができます。

Page 10: RailsでKnockout.js

とりあえず使ってみよう

Page 11: RailsでKnockout.js

Railsに導入してみる

Page 12: RailsでKnockout.js

導入方法

・JSファイルをダウンロードして追加 ・gemを使う

Page 13: RailsでKnockout.js

今回はgemを使います

Page 14: RailsでKnockout.js

knockoutjs-rails

・JSファイルをダウンロードして追加 ・gemを使う

Page 15: RailsでKnockout.js

これで使える・・・

Page 16: RailsでKnockout.js

と思ったら罠が

Page 17: RailsでKnockout.js

Rails4そのままだと動かない

Page 18: RailsでKnockout.js

原因は・・・

Page 19: RailsでKnockout.js

_人人人人人人人_ > turbolinks <

‾Y^Y^Y^Y^Y^Y‾

Page 20: RailsでKnockout.js

Rails4デフォルトで動かない

・どうやらturbolinksが原因っぽい ・turbolinksとknockoutが競合してる? ・turbolinksを無効にすると動きます

Page 21: RailsでKnockout.js

さようならturbolinks

Page 22: RailsでKnockout.js

これで使える

Page 23: RailsでKnockout.js

導入方法まとめ

・プロジェクトにknockoutを追加 ・turbolinksを無効にする←大事!

Page 24: RailsでKnockout.js

使うと楽できる所

Page 25: RailsでKnockout.js

入力値を同期したい

Page 26: RailsでKnockout.js

入力値を同期する

%input(type="text" data-bind="value: message") %br %span(data-bind="text: message")

$ -> TestappViewModel = -> self = this self.message = ko.observable("Hello World!!") ko.applyBindings new TestappViewModel() return

coffescript

haml

Page 27: RailsでKnockout.js

デモ

Page 28: RailsでKnockout.js

クリックに対して何かしたい

Page 29: RailsでKnockout.js

クリックでカウントアップ

%span(data-bind="text: numberOfClicks") 回クリックしました%button(data-bind="click: incrementClickCounter") クリックしてください

$ -> TestappViewModel = -> self = this self.numberOfClicks = ko.observable(0) self.incrementClickCounter = -> previousCount = this.numberOfClicks() this.numberOfClicks(previousCount + 1)

ko.applyBindings new TestappViewModel() return

coffescript

haml

Page 30: RailsでKnockout.js

デモ

Page 31: RailsでKnockout.js

配列に入ってるデータを表示

Page 32: RailsでKnockout.js

配列のデータを出力

%ul(data-bind="foreach: users") %li %span(data-bind="text: name”) : %span(data-bind="text: type")

$ -> TestappViewModel = -> self = this self.users = ko.observableArray([ { name: "太郎", type: "長男" }, { name: "二郎", type: "次男" }, { name: "花子", type: "長女" } ]);

ko.applyBindings new TestappViewModel() return

coffescript

haml

Page 33: RailsでKnockout.js

デモ

Page 34: RailsでKnockout.js

詳しい情報は 日本語ドキュメントで

http://kojs.sukobuto.com/

Page 35: RailsでKnockout.js

実際使ってみてどうなの?

Page 36: RailsでKnockout.js

個人的にいいなと思ってる所

・画面周りの制御に特化してる ・CSSの付け替え、表示切り替えが楽 ・Javascript用のクラスを付けなくていい ・Webフレームワークの領域と喧嘩しない

Page 37: RailsでKnockout.js

まとめ

Page 38: RailsでKnockout.js

Knockout.js便利!

Page 39: RailsでKnockout.js

プロジェクトにも入れやすい

Page 40: RailsでKnockout.js

まだCSSの 切り替えで消耗してるの?

Page 41: RailsでKnockout.js

ぜひ使ってみてください

Page 42: RailsでKnockout.js

おわり

Page 43: RailsでKnockout.js

はまり所

・2重バインドでエラー ・否定の場合は()が必要

Page 44: RailsでKnockout.js

多重バインドでエラー

%ul(data-bind="foreach: users") %li %span(data-bind="text: name”) : %span(data-bind="text: type")

$ -> TestappViewModel = -> self = this self.users = ko.observableArray([ { name: "太郎", type: "長男" }, { name: "二郎", type: "次男" }, { name: "花子", type: "長女" } ]);

ko.applyBindings new TestappViewModel() return

coffescript

haml