SlideShare a Scribd company logo
作って分かる
KnockoutJS
2013/11/19(火)
@ALM 11月
自己紹介
KLab株式会社
エンジニア

上田拓也
Go, JavaScript, Java,
twitter : @tenntenn

PHP
アジェンダ
● KnockoutJSとは?
● バインディングの仕組み
● 実装してみた
KnockoutJSとは?
KnockoutJSとは?
● JavaScriptのMVVMフレームワーク
○ MVVM: Model-View-ViewModel

● ViewModel(VM)とDOMの要素を双方向バイン
ドする機能を提供する
バインド
ViewModel

Element
KnockoutJSの特徴
● コールバックが少なくなる
● 他のフレームワークと一緒に使える
○ 提供しているのはバインディングだけ
○ 既存のプロジェクトに投入しやすい(かも)

● 独自タグを使っていない
○ data-bind属性かコメントを使う
○ でもdata-bind属性が大きくなりすぎる
■ <div data-bind=”abind: avalue, cbind: cvalue,...”>

● 割りと重い
○ モバイル用途だと若干重い
KnockoutJSの双方向バインド
(1)ViewModel → Element
ViewModel
{
firstName: ‘Foo’,
lastName: ‘Bar’
}

Element

バインド

<input value=”Foo”>
<input value=”Bar”>
KnockoutJSの双方向バインド
(1)ViewModel → Element
ViewModel
{
firstName: ‘Piyo’,
lastName: ‘Hoge’
}

Element

バインド

<input value=”Foo”>
<input value=”Bar”>
KnockoutJSの双方向バインド
(1)ViewModel → Element
ViewModel
{
firstName: ‘Piyo’,
lastName: ‘Hoge’
}

Element

バインド <input value=”Piyo”>
<input value=”Hoge”>
KnockoutJSの双方向バインド
(2)ViewModel ← Element
ViewModel
{
firstName: ‘Foo’,
lastName: ‘Bar’
}

Element

バインド

<input value=”Foo”>
<input value=”Bar”>
KnockoutJSの双方向バインド
(2)ViewModel ← Element
ViewModel
{
firstName: ‘Foo’,
lastName: ‘Bar’
}

Element

バインド <input value=”Piyo”>
<input value=”Hoge”>
KnockoutJSの双方向バインド
(2)ViewModel ← Element
ViewModel
{
firstName: ‘Piyo’,
lastName: ‘Hoge’
}

Element

バインド <input value=”Piyo”>
<input value=”Hoge”>
KnockoutJSの使用例
■HTML
<input data-bind=”value:firstName”>
<input data-bind=”value:lastName”>
■JavaScript
var vm = {
firstName: ko.observable(“Foo”),
lastName: ko.observable(“Bar”)
};
ko.applyBindings(vm, document.body);
http://jsfiddle.net/uedatakuya/ma43x/
いろいろなバインディング
● cssバインド
<div data-bind=”css: {error, isError}”></div>
● if/ifnotバインド
<!-- ko if: ok -->OK<!-- /ko-->

● foreachバインド
<ol data-bind=”foreach: items”>
<li data-bind=”text:$data.name”></li>
</ol>
http://knockoutjs.com/documentation/introduction.html
カスタムバインド
● 独自バインドを作ることができる
ko.bindingHandlers.yourBindingName = {
init: function(element, valueAccessor,
allBindings, viewModel, bindingContext) {
},
update: function(element, valueAccessor,
allBindings, viewModel, bindingContext) {
}
}
<div data-bind=”yourBindingName: someValue”></div>
http://knockoutjs.com/documentation/custom-bindings.html
ko.computed
(ko.dependentObservable)
● 他observable(subscribable)に依存した
observableを作れる
var a = ko.observable(100);
var c = ko.obaervable(200);
var c = ko.computed(function() {
return a() + b();
});
console.log(a(), b(), c()); // 100, 200, 300
⇒どういう仕組で動いているのか?
バインディングの仕組み
バインディングの仕組み
●

KnockoutJSのバインディングの仕組
みをソースコードを読んでみて理解する
対象とするもの
● ko.subscribable(ko.subscription)
● ko.observable
● ko.dependencyDetection
● ko.dependentObservable(ko.
computed)
http://jsfiddle.net/uedatakuya/9hS5n/
ko.subscribable
ko.subscribable
-----------------------------+subscribe()
+notifySubscripters()

ko.observable

ko.dependentObservable
(ko.computed)

http://jsfiddle.net/uedatakuya/9hS5n/
ko.computed
(ko.dependentObservable)
● 他observable(subscribable)に依存した
observableを作れる
var a = ko.observable(100);
var c = ko.obaervable(200);
var c = ko.computed(function() {
return a() + b();
});
console.log(a(), b(), c()); // 100, 200, 300
⇒どういう仕組で動いているのか?
ko.observable(ko.subscribable)
ko.observable
(ko.subscribable)

subscripter

subscript

Write

notifySubscripters

callback

http://jsfiddle.net/uedatakuya/9hS5n/
ko.dependenctyDetectionと
ko.dependentObservable
ko.
dependentObserva
ble
Init

ko.
dependencyDet
ection

ko.subscribable

evaluateImediate
begin
Read
registerDependency
callback
<依存関係に追加>

end
http://jsfiddle.net/uedatakuya/9hS5n/
実装してみた
実装してみた
●

さらに簡単に実装してみて理解する

● エラー処理や難しいことは省く
http://jsfiddle.net/uedatakuya/9hS5n/
【解説】実装してみた
● https://gist.github.
com/tenntenn/7540535
● http://jsfiddle.
net/uedatakuya/9hS5n/

More Related Content

PDF
Knockout.js を利用したインタラクティブ web アプリケーション開発
PPTX
KnockoutJSを使用したアプリケーションの構築例
PPTX
20140517 knockoutjs hands-on
PDF
KnockoutJS勉強会 プロジェクトにmvvmを適用する狙い
PPTX
Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
PPTX
クライアントサイドMVVMアーキテクチャとVue.jsをまとめたよ
PDF
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
PPTX
AngularJSを浅めに紹介します
Knockout.js を利用したインタラクティブ web アプリケーション開発
KnockoutJSを使用したアプリケーションの構築例
20140517 knockoutjs hands-on
KnockoutJS勉強会 プロジェクトにmvvmを適用する狙い
Webアプリ開発のトレンドとUIライブラリ開発事情(仙台Geek★Night #1)
クライアントサイドMVVMアーキテクチャとVue.jsをまとめたよ
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
AngularJSを浅めに紹介します

What's hot (20)

PDF
React.js + Flux
PPTX
Windows ストアアプリのgrid viewを入門してみた
PDF
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
PDF
( ゚∀゚)o彡° Flux! Flux!
PPTX
ライオンでも分かるVuejs
PDF
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
PPTX
エンタープライズ分野での実践AngularJS
PDF
プロダクトに 1 から Vue.js を導入した話
PDF
Vue.js入門
PDF
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
PPTX
チュートリアルではじめるVue.js
PPTX
簡単AngularJS(関西AngularJS勉強会)
PDF
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
PDF
株式会社インタースペース 清水様 登壇資料
PDF
翻訳から始めるVue.js 入門
PDF
Flux react現状確認会
PPT
T35 ASP.NET MVCを使ったTDD入門
PPTX
~初心者がこれから Web アプリの開発をするために~
PDF
SIROK技術勉強会 #1 「Reactってなんだ?」
PDF
jQuery と MVC で実践する標準志向 Web 開発
React.js + Flux
Windows ストアアプリのgrid viewを入門してみた
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
( ゚∀゚)o彡° Flux! Flux!
ライオンでも分かるVuejs
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
エンタープライズ分野での実践AngularJS
プロダクトに 1 から Vue.js を導入した話
Vue.js入門
ASP.NET MVC と jQuery で実践する標準志向 Web 開発
チュートリアルではじめるVue.js
簡単AngularJS(関西AngularJS勉強会)
Moq & Fakes Framework を使った実践的ユニットテスト - BuildInsider
株式会社インタースペース 清水様 登壇資料
翻訳から始めるVue.js 入門
Flux react現状確認会
T35 ASP.NET MVCを使ったTDD入門
~初心者がこれから Web アプリの開発をするために~
SIROK技術勉強会 #1 「Reactってなんだ?」
jQuery と MVC で実践する標準志向 Web 開発
Ad

Similar to 作って分かるKnockoutJS@ALM11月 (14)

PDF
How do you like knockout?
PDF
Knockout を用いた Firefox OS アプリケーションの開発
PDF
Knockout_エンジニア勉強会20131120
KEY
Knockout
PDF
実践Knockout
PDF
ftechmeetup_データバインディングはどう実装されているのか
PDF
DevLOVE Kansai KnockoutJS
PPTX
20140712 knockoutjs-hands-on-in-osaka
PDF
Study Intro Backbone
PPT
20130924 Picomon CRH勉強会
PDF
Knockout handson
PDF
Getting start with knockout.js
PDF
Backbone.js
PDF
Swift bondさわってみた
How do you like knockout?
Knockout を用いた Firefox OS アプリケーションの開発
Knockout_エンジニア勉強会20131120
Knockout
実践Knockout
ftechmeetup_データバインディングはどう実装されているのか
DevLOVE Kansai KnockoutJS
20140712 knockoutjs-hands-on-in-osaka
Study Intro Backbone
20130924 Picomon CRH勉強会
Knockout handson
Getting start with knockout.js
Backbone.js
Swift bondさわってみた
Ad

More from Takuya Ueda (20)

PDF
Goにおけるバージョン管理の必要性 − vgoについて −
PDF
WebAssembly with Go
PDF
GAE/Goとsyncパッケージ
PDF
静的解析を使った開発ツールの開発
PDF
そうだ、Goを始めよう
PDF
マスター・オブ・goパッケージ
PDF
メルカリ カウルのマスタデータの更新
PDF
Go1.8 for Google App Engine
PDF
Go Friday 傑作選
PDF
GoによるiOSアプリの開発
PDF
Static Analysis in Go
PDF
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
PDF
メルカリ・ソウゾウでは どうGoを活用しているのか?
PDF
エキスパートGo
PDF
Go静的解析ハンズオン
PDF
Goにおける静的解析と製品開発への応用
PDF
オススメの標準・準標準パッケージ20選
PDF
Gopher Fest 2017参加レポート
PDF
Google Assistant関係のセッションまとめ
PDF
Cloud functionsの紹介
Goにおけるバージョン管理の必要性 − vgoについて −
WebAssembly with Go
GAE/Goとsyncパッケージ
静的解析を使った開発ツールの開発
そうだ、Goを始めよう
マスター・オブ・goパッケージ
メルカリ カウルのマスタデータの更新
Go1.8 for Google App Engine
Go Friday 傑作選
GoによるiOSアプリの開発
Static Analysis in Go
静的解析とUIの自動生成を駆使してモバイルアプリの運用コストを大幅に下げた話
メルカリ・ソウゾウでは どうGoを活用しているのか?
エキスパートGo
Go静的解析ハンズオン
Goにおける静的解析と製品開発への応用
オススメの標準・準標準パッケージ20選
Gopher Fest 2017参加レポート
Google Assistant関係のセッションまとめ
Cloud functionsの紹介

作って分かるKnockoutJS@ALM11月