64
How do you like knockout? 合同勉強会 in 大都会岡山 -2014 Winter- 2014/12/13 OITEC きよくら ならみ

How do you like knockout?

Embed Size (px)

DESCRIPTION

『合同勉強会 in 大都会岡山 -2014 Winter-』の同名のセッションの資料 http://gbdaitokai.doorkeeper.jp/events/15289

Citation preview

Page 1: How do you like knockout?

How do you like knockout?

合同勉強会 in 大都会岡山 -2014 Winter-2014/12/13

OITECきよくら ならみ

Page 2: How do you like knockout?

自己紹介

• きよくら ならみ–@kiyokura

–kiyokura.hateblo.jp

• NET系の開発やWebアプリ開発–Microsoft MVP for ASP.NET/IIS

• 近況: #R社

Page 3: How do you like knockout?

コミュニティ紹介

• Okayama IT Engineers Community

–OITEC

• .NET系・MS系のテクノロジが多い?

–特にしばりはないので、色々welcome

• http://oitec.vbstation.net/

Page 4: How do you like knockout?

本日のお品書き

• knockout.js のぼんやりした説明

• はじめての ばいんでぃんぐ

• バインディングの基本

• その他、色々

• もうちょっとだけ実用的かもしれない例

• まとめ

Page 5: How do you like knockout?

knockout.js のぼんやりした説明

Page 6: How do you like knockout?

Declarative Bindings

Automatic UI Refresh

Dependency Tracking

Templating

Simplify dynamic JavaScript UIs

with the

Model-View-ViewModel pattern

Page 7: How do you like knockout?

なんのこっちゃ

Page 8: How do you like knockout?

knockout.jsとは

• JavaScriptのライブラリ–フレームワークとも言われるが…

• AngularJSなどと違いフルスタックではない

• コンセプト–宣言型バインディング

–自動的なUIの更新

–依存性の追跡

–テンプレート

Page 9: How do you like knockout?

knockout.jsとは

• http://knockoutjs.com/

• OSS–MITライセンス

–https://github.com/knockout

Page 10: How do you like knockout?

こんなことができる(ようになる)

• 動的なUIをシンプルに構築

–JSとHTMLの依存関係を整理しやすく

–MVVMパターンの導入も視野に

Page 11: How do you like knockout?

非機能的な特徴

• 他のライブラリに依存しない– 取り回しが良い

• 機能がシンプル– 学習コストが低い

• 導入のハードルが全体的に低い– 「一部だけに使用」にも抵抗が少ない

– サーバサイドの言語・フレームワークを選ばない

– 古いブラウザでも動作

Page 12: How do you like knockout?

導入方法

• 取り込み– webからDL

• 公式サイト or github

– bower• bower install knockout

– NuGet• Install-Package knockoutjs

• CDN– https://cdnjs.com/– http://www.asp.net/ajax/cdn

Page 13: How do you like knockout?

四の五の言ってもあれなので

• knockoutの2大機能を中心に紹介

Page 14: How do you like knockout?

はじめての ばいんでぃんぐ

Page 15: How do you like knockout?

knockout 二大機能の一つ

• 「バインディング」をまずは軽く紹介

Page 16: How do you like knockout?

バインディングとは

• バインディング(binding)

–縛りつける・結びつける

• UIとJSのオブジェクトを結びつける

–「代入とは違うのだよ、代入とは!」

• バインド=宣言的

• 代入=手続的

Page 17: How do you like knockout?

var user = { name: "きよくら", age: 20 };

このオブジェクトの値を…

こんなHTMLに設定したい…とする

Page 18: How do you like knockout?

data-bind属性

• data-*属性を利用

• 「なにをどこにバインドするか」”宣言”

–なにを : JSのオブジェクト

–どこに : どの属性

data-bind="value:name"

Page 19: How do you like knockout?

ko.applyBindings()

• HTMLと紐づけるオブジェクトを用意

• ko.applyBindings()で紐づけを実行

ko.applyBindings(user);

Page 20: How do you like knockout?

knockoutによるバインディング

<script type="text/javascript">

$(function () {

var user = { name: "kiyokura", age: 20 };

ko.applyBindings(user);

});

</script>

<p>

name:<input type="text" data-bind="value:name" /><br />

age:<input type="text" data-bind="value:age" /><br />

</p>

Page 21: How do you like knockout?

one more thing,

• これは「単方向」バインディング

–Not “One time” , but “One way”

• UI側の更新が自動的にオブジェクトへ

Page 22: How do you like knockout?

JS側のオブジェクトの値を確認してみる

$("#btnCkeck").click(function () {alert(user.age);

});

<input type="button"value="check" id="btnCkeck" />

Page 23: How do you like knockout?

JS側のオブジェクトの値を確認してみる

Page 24: How do you like knockout?

単方向バインディング

• オブジェクトをHTMLに結びつける

– “代入”ではなく”宣言”

–UIの変更が自動的にオブジェクトへ

• 依存関係がシンプルに

–JSからHTML(DOM)参照が消滅

• 実際は0にならないケースあるが間違いなく減る

Page 25: How do you like knockout?

ごくシンプルな機能だが

• これだけでも有効な場合がある

–サーバサイドの比重が大きい場合など、JSのコード量を減らせる(可能性)

–HTMLとJSの依存関係を減らせる

• 生産性UP&保守性UP につながる可能性

Page 26: How do you like knockout?

jQueryでやると…

<input type="text" id="name" /><input type="text" id="age" />

var user = {name: "kiyokura", age: 20 };$("#name").val(user.name);$("#age").val(user.age);

Page 27: How do you like knockout?

バインディングの基本

Page 28: How do you like knockout?

「監視」を絡めたバインディング

• 二大機能のもう一方、「監視」

• バインディングの真骨頂(たぶん)

Page 29: How do you like knockout?

Observable による状態の監視

var user = {name: ko.observable("kiyokura"),age: ko.observable(20)

};

Page 30: How do you like knockout?

Observable による状態の監視

var user = {name: ko.observable("kiyokura"),age: ko.observable(20)

};

Page 31: How do you like knockout?

オブジェクトを操作してみる

$("#btnYounger").click(function (){

var age = user.age();user.age(age - 1);

});

<input type="button"id="btnYounger" value="若返り" />

Page 32: How do you like knockout?

オブジェクトの変更がUIへ

Page 33: How do you like knockout?

双方向バインディング

• 「監視」という機能

–observableオブジェクトでラップ

• オブジェクトを監視し、UIに通知

–UIを自動更新

ko.observable()ko.observableArray()

Page 34: How do you like knockout?

ついでに、もうちょっと

• バインドできるのは“値”だけではない

• その一例を少しだけ

Page 35: How do you like knockout?

“計算結果” をバインド

var User = function () {var self = this;self.name = ko.observable("kiyokura");self.age = ko.observable(20);self.message = ko.computed(

function () {return self.name() + ", " +

self.age() + "さい";});

};var user = new User();

<span data-bind="text:message"></span>

Page 36: How do you like knockout?

イベントにメソッドをバインド

self.toYounger = function () {var age = user.age();user.age(age - 1);

};

<input type="button" value="若返り"data-bind="click:toYounger" />

Page 37: How do you like knockout?
Page 38: How do you like knockout?

双方向バインド

• “監視”と”バインド”のko 2大機能で

• オブジェクトとUI双方向で監視・更新

• “状態”と”コマンド”可能な機構

–これを生かしてPDSの観点で設計・実装

• それ、MVVMいけるんじゃね

Page 39: How do you like knockout?

その他、色々

Page 40: How do you like knockout?

いろんなバインディング

• テキストとか表現的な

–visible

–text

–html

– css

–style

–attr

Page 41: How do you like knockout?

いろんなバインディング

• 制御構文的な

–foreach

– if

– ifnot

–with

– component

Page 42: How do you like knockout?

いろんなバインディング

• フォーム部品関係

– click

–event

–submit

–enable

–disable

–value

Page 43: How do you like knockout?

いろんなバインディング

• フォーム部品関係

–textInput

–hasFocus

– checked

–options

–selectedOptions

–uniqueName

Page 44: How do you like knockout?

いろんなバインディング

• テンプレーティング

–template

Page 45: How do you like knockout?

カスタマイズや拡張

• カスタム・バインディング

–バインディングをカスタマイズ可能

• extend

–拡張メソッド(みたいな感じ)

Page 46: How do you like knockout?

もうちょっとだけ実用的かもしれない例

Page 47: How do you like knockout?

もうちょっとだけ実用的かもしれない例

• 例:json形式のデータを出し入れ

• 例:WebStorageへの保存機能を後付

Page 48: How do you like knockout?

例:json形式のデータを出し入れ

• 先ほどまでの例だと…「実際つかえるの?」と思うかもしれません

• ko.observableでイチイチラップしたオブジェクトを毎回定義するの?

• 大丈夫、無問題。

Page 49: How do you like knockout?

ko.mappingプラグイン

• オブジェクトやJSONをko.observableでラップされたオブジェクトを生成するvar jsData = {name: "foo",age:20};var vm = ko.mapping.fromJS(jsData);

Page 50: How do you like knockout?

ko.mappingプラグイン

• 逆にプレーンなオブジェクトにマッピングしなおすことも可能

var json = ko.mapping.toJSON(vm);

Page 51: How do you like knockout?

なので…こんなことも割と楽に可能

• ajaxでデータを取得してモデル作成

• モデルをJSON化してajaxで送信

Page 52: How do you like knockout?

例:WebStorageへの保存機能を後付

• koは「ちょっとココだけ使う」ことも比較的楽

• その一例

–https://github.com/kiyokura/komappingdemo

Page 53: How do you like knockout?

何の変哲もないwebフォーム

• 「localStorageに一時保存させて」と言われたたら?

<form action="register.php" method="post"><p>姓: <input type="text" name="lastName" />名: <input type="text" name="firstName" /><br />tel: <input type="text" name="tel" /><br />e-mail: <input type="text" name="email" /><br /><hr /><input type="submit" value="登録" />

</p></form>

Page 54: How do you like knockout?

それ、knockoutで

JSからDOMを見てるが、こんな

パターンなら別にいいんじゃないかと思う(個人的には)

Page 55: How do you like knockout?

まとめ

Page 56: How do you like knockout?

knockoutとは

• UIとオブジェクトの双方向バインディングを実現するJSライブラリ

• 主要機能は監視とバインディング

• "部分利用" から "フレームワーク"まで場面に応じて利用可能

Page 57: How do you like knockout?

knockout とは

• OSS

–gihub

–MITライセンス

• 依存関係もシンプル

–ほかのJSライブラリに依存しない

–サーバサイドのテクノロジにも依存しない

• (RubyでもPHPでも.NETでも)

Page 58: How do you like knockout?

個人的な感想

• つまみ食いしやすい

–アプリのアーキテクチャに食い込まない(ような使い方が可能)

• サーバサイドのフレームワークとも相性がいいと思う

–学習コストが低い

Page 59: How do you like knockout?

参考・リソース

Page 60: How do you like knockout?

公式サイト

• http://knockoutjs.com/

• ドキュメントとチュートリアルが充実

–ここの情報だけだいたいどうにかなる

–チュートリアルもとっつきが良い

Page 61: How do you like knockout?

おすすめ資料

• 『Knockout.jsの概要』

–by Mayuki Sawatari

–https://speakerdeck.com/mayuki/knockout-dot-jsfalsegai-yao

• knockoutの二大機能の仕組みを丁寧にわかりやすく解説。おすすめ。

• 動画もあります。

– https://www.youtube.com/watch?v=U-TRaV3IU6A

Page 62: How do you like knockout?

気軽に試すならjsfiddleで

• http://jsfiddle.net/

• ブラウザでJavaScriptを試せる

–保存やシェアもできるよ

• メジャーなライブラリを標準サポート

–knockoutも対応

Page 63: How do you like knockout?

番外編 - JSFiddleのポイント(?)

• jQueryとknockoutを使うなら

– [Frameworks & Extensions]

• jQueryを選択

–[External Resources]

• knockoutのCDNを指定

– http://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js

Page 64: How do you like knockout?

ご清聴ありがとうございました