SlideShare a Scribd company logo
1 of 33
@hakurai
What is knockout?

✤   JavaScriptでMVVMを実現するフレームワーク
✤   というわけで今日はJavaScriptのおはなし
What is MVVM?




✤   MVVMはGUIのアーキテクチャパターンの一つ

    ✤   MVCとかMVPとか...

✤   Model - Veiw - ViewModel
MVVMではViewを直接操作しない




✤   えっ

✤   画面表示はどうやって更新するの?
ViewModelを操作する




✤   ViewModelはViewの抽象表現

✤   バインディングを使用してViewとViewModelを同期する
だいたいこんな感じ


     View        ViewModelの描画
            同期


   ViewModel     Viewの状態とロジック




    Model        その他
つかいかた
ボタンクリックで文字を表示
ViewModelを定義する


  var viewModel = {};

  viewModel.message = ko.observable('');

  viewModel.clickAction = function(){
     viewModel.message('hello world!');
  };

  ko.applyBindings(viewModel);
ViewModelにプロパティを追加


  var viewModel = {};

  viewModel.message = ko.observable('');

  viewModel.clickAction = function(){
     viewModel.message('hello world!');
  };

  ko.applyBindings(viewModel);
最後にViewとバインド


  var viewModel = {};

  viewModel.message = ko.observable('');

  viewModel.clickAction = function(){
     viewModel.message('hello world!');
  };

  ko.applyBindings(viewModel);
Viewのコード




 <body>
 <input type="button" value="click here!">
 <div></div>
 </body>
data-bind属性を追加する




                                                 イベントに対応する関数
 <body>
 <input type="button" data-bind="click: clickAction" value="click here!">
 <div data-bind="text: message"></div>
 </body>
                                    テキストにmessageの
                                          内容を表示
こんな感じにバインド


  View               ViewModel

         viewModel.clickAction = function(){
            viewModel.message('hello world!');
         };

         viewModel.message = ko.observable('');
1.イベントと紐付いた関数が呼ばれる


  View               ViewModel

         viewModel.clickAction = function(){
            viewModel.message('hello world!');
         };

         viewModel.message = ko.observable('');
2.ViewModelのプロパティを変更


   View                ViewModel

           viewModel.clickAction = function(){
              viewModel.message('hello world!');
           };

           viewModel.message = ko.observable('');

                              hello world!
3.自動でViewを更新


  View                 ViewModel

           viewModel.clickAction = function(){
              viewModel.message('hello world!');
           };

           viewModel.message = ko.observable('');

                              hello world!
ちなみにjQueryだと...




            セレクタ

 $(‘input’).on(‘click’, function(){
     $(‘div’).text(‘hello world!’);
 });
                セレクタ
大きくて複雑なHTMLの場合




✤   複雑なjQueryのセレクタ

    ✤   セレクタを書くためだけのidとclass

✤   コード内にあふれるイベント登録、セレクタ、DOM操作
よくある感じのコード



                   セレクタ

 var editorCache = $(‘#hoge div.editor’);       イベント登録

 editorCache.find(‘[type=”button”]’).on(‘click’, function(){
 セレクタeditorCache.find(‘div.message’).text(‘hello world!’);
 });
                      セレクタ                        DOM操作
本質的ではないコードで見通しが悪い




✤   前のサンプルで実現したいこと

    ✤   ボタンがクリックされたらメッセージを表示する
あらためてknockoutを使ったコード




 viewModel.clickAction = function(){
    viewModel.message('hello world!');
 };
knockoutを使うメリット



✤   Viewの抽象表現であるViewを定義することで

    ✤   View(DOM)の構造の影響が少ない

    ✤   idとかclassとか親子関係とか

    ✤   data-bind属性だけ書いておけばおっけー
デメリット




✤   他のjQueryプラグインとかとの組み合わせ

    ✤   data-bind属性書けないし...

    ✤   カスタムバインディングでなんとかできるけど面倒
機能紹介
Observables



✤   observable

    ✤   値が変更されたらViewと同期

✤   observableArray

    ✤   オブジェクトが追加・削除されたら通知

✤   computed
observableをいつ使うか




✤   ViewとViewModelで状態を同期するプロパティ

    ✤   Viewが変更されたらViewModelを更新(一部のバインディング)

    ✤   ViewModelが変更されたらViewを更新
observableArray




✤   foreachとあわせて使う場合がほとんど

    ✤   要素が増えたらテーブルの行を追加とか
テキストと外見に関するbindその1


✤   visible

    ✤   要素の表示・非表示

✤   text

    ✤   要素のテキスト

✤   html

    ✤   要素のinnerHTML
テキストと外見に関するbindその2


✤   css

    ✤   クラス属性の追加・削除

✤   style

    ✤   要素のスタイルを設定

✤   attr

    ✤   属性を設定
foreachの使い方



                                       observableArray
                                        のプロパティ

 <ul data-bind="foreach: members">
   <li data-bind="text: $data"></li>
 </ul>
                                           繰り返す部分
foreachとアニメーション

✤   オブジェクトの追加後、削除前に呼び出す関数を設定できる

    ✤   afterAdd

    ✤   beforeRemove

✤   ここにアニメーションのコードを書く

    ✤   jQueryのfadeInとかhide(‘normal’)とか

More Related Content

What's hot

jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tipsyoshikawa_t
 
20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック良太 増子
 
Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Kei Yagi
 
deviseを利用した認証について@Minamirb
deviseを利用した認証について@Minamirbdeviseを利用した認証について@Minamirb
deviseを利用した認証について@MinamirbJun Fukaya
 
はじめてのVue.js
はじめてのVue.jsはじめてのVue.js
はじめてのVue.jsKei Yagi
 
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイドFrom Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイドYuichi Sakuraba
 
jQuery Mobile 1.3 最新情報
jQuery Mobile 1.3 最新情報jQuery Mobile 1.3 最新情報
jQuery Mobile 1.3 最新情報yoshikawa_t
 
何が変わった JavaFX 2.0
何が変わった JavaFX 2.0何が変わった JavaFX 2.0
何が変わった JavaFX 2.0Yuichi Sakuraba
 
jQuery Mobile 1.2 最新情報 & Tips
jQuery Mobile 1.2 最新情報 & TipsjQuery Mobile 1.2 最新情報 & Tips
jQuery Mobile 1.2 最新情報 & Tipsyoshikawa_t
 
本当にあった怖いJS
本当にあった怖いJS本当にあった怖いJS
本当にあった怖いJSTen Tokoro
 
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)Kei Yagi
 
Vue Router + Vuex
Vue Router + VuexVue Router + Vuex
Vue Router + VuexKei Yagi
 
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)a know
 
Kawaz的jQuery入門
Kawaz的jQuery入門Kawaz的jQuery入門
Kawaz的jQuery入門Kohki Miki
 
Angular jsとsinatraでturbolinks
Angular jsとsinatraでturbolinksAngular jsとsinatraでturbolinks
Angular jsとsinatraでturbolinksMinori Tokuda
 
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦うViewを活用して複雑化と戦う
Viewを活用して複雑化と戦うKenjiro Kubota
 

What's hot (20)

jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tips
 
20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック
 
jQuery Mobileの基礎
jQuery Mobileの基礎jQuery Mobileの基礎
jQuery Mobileの基礎
 
Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方Vue.js 基礎 + Vue CLI の使い方
Vue.js 基礎 + Vue CLI の使い方
 
Java script
Java scriptJava script
Java script
 
deviseを利用した認証について@Minamirb
deviseを利用した認証について@Minamirbdeviseを利用した認証について@Minamirb
deviseを利用した認証について@Minamirb
 
はじめてのVue.js
はじめてのVue.jsはじめてのVue.js
はじめてのVue.js
 
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイドFrom Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
 
jQuery Mobile 1.3 最新情報
jQuery Mobile 1.3 最新情報jQuery Mobile 1.3 最新情報
jQuery Mobile 1.3 最新情報
 
何が変わった JavaFX 2.0
何が変わった JavaFX 2.0何が変わった JavaFX 2.0
何が変わった JavaFX 2.0
 
jQuery Mobile 1.2 最新情報 & Tips
jQuery Mobile 1.2 最新情報 & TipsjQuery Mobile 1.2 最新情報 & Tips
jQuery Mobile 1.2 最新情報 & Tips
 
本当にあった怖いJS
本当にあった怖いJS本当にあった怖いJS
本当にあった怖いJS
 
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
Vue.jsの関連ツール・ライブラリ(Vuex, Vue-Router, Nuxt)
 
Scene BuilderでFXML
Scene BuilderでFXMLScene BuilderでFXML
Scene BuilderでFXML
 
Vue Router + Vuex
Vue Router + VuexVue Router + Vuex
Vue Router + Vuex
 
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
 
Kawaz的jQuery入門
Kawaz的jQuery入門Kawaz的jQuery入門
Kawaz的jQuery入門
 
jQuery Mobile 概要
jQuery Mobile 概要jQuery Mobile 概要
jQuery Mobile 概要
 
Angular jsとsinatraでturbolinks
Angular jsとsinatraでturbolinksAngular jsとsinatraでturbolinks
Angular jsとsinatraでturbolinks
 
Viewを活用して複雑化と戦う
Viewを活用して複雑化と戦うViewを活用して複雑化と戦う
Viewを活用して複雑化と戦う
 

Viewers also liked

Viewers also liked (6)

JavaFX8
JavaFX8JavaFX8
JavaFX8
 
実践Knockout
実践Knockout実践Knockout
実践Knockout
 
Java fx & xtext
Java fx & xtextJava fx & xtext
Java fx & xtext
 
Haxe
HaxeHaxe
Haxe
 
Java 並行処理の基礎update1
Java 並行処理の基礎update1Java 並行処理の基礎update1
Java 並行処理の基礎update1
 
Starting java fx
Starting java fxStarting java fx
Starting java fx
 

Similar to Knockout

Magento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for DesignMagento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for DesignMiho Nakano
 
RIAアーキテクチャー研究会 第3回 セッション4 Mvpvm pattern
RIAアーキテクチャー研究会 第3回 セッション4 Mvpvm patternRIAアーキテクチャー研究会 第3回 セッション4 Mvpvm pattern
RIAアーキテクチャー研究会 第3回 セッション4 Mvpvm patternMami Shiino
 
ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~Yoshitaka Seo
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会Yukihiro Kitazawa
 
Xamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツXamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツMasuda Tomoaki
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.jsHiroki Toyokawa
 
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみようJavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみようHiroaki Wakamatsu
 
Introduction for Browser Side MVC
Introduction for Browser Side MVCIntroduction for Browser Side MVC
Introduction for Browser Side MVCRyunosuke SATO
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
Windows ストアアプリのgrid viewを入門してみた
Windows ストアアプリのgrid viewを入門してみたWindows ストアアプリのgrid viewを入門してみた
Windows ストアアプリのgrid viewを入門してみた一希 大田
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとかyouku
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
Mithril - 軽量/高速なMVCフレームワーク
Mithril - 軽量/高速なMVCフレームワークMithril - 軽量/高速なMVCフレームワーク
Mithril - 軽量/高速なMVCフレームワークsairoutine
 
Jqm20120210
Jqm20120210Jqm20120210
Jqm20120210cmtomoda
 
Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発Daizen Ikehara
 

Similar to Knockout (20)

Visualforce + jQuery
Visualforce + jQueryVisualforce + jQuery
Visualforce + jQuery
 
Magento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for DesignMagento meet up Tokyo#1 for Design
Magento meet up Tokyo#1 for Design
 
RIAアーキテクチャー研究会 第3回 セッション4 Mvpvm pattern
RIAアーキテクチャー研究会 第3回 セッション4 Mvpvm patternRIAアーキテクチャー研究会 第3回 セッション4 Mvpvm pattern
RIAアーキテクチャー研究会 第3回 セッション4 Mvpvm pattern
 
ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~ASP.NET MVC 2 ~新機能の紹介~
ASP.NET MVC 2 ~新機能の紹介~
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会
 
Mvpvm pattern
Mvpvm patternMvpvm pattern
Mvpvm pattern
 
Xamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツXamarin.formsでのmvvm利用のコツ
Xamarin.formsでのmvvm利用のコツ
 
はじめよう Backbone.js
はじめよう Backbone.jsはじめよう Backbone.js
はじめよう Backbone.js
 
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみようJavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
JavaScript + CSS3を活用して スマートフォンサイト/アプリに 動きを付けてみよう
 
Introduction for Browser Side MVC
Introduction for Browser Side MVCIntroduction for Browser Side MVC
Introduction for Browser Side MVC
 
Study Intro Backbone
Study Intro BackboneStudy Intro Backbone
Study Intro Backbone
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
Windows ストアアプリのgrid viewを入門してみた
Windows ストアアプリのgrid viewを入門してみたWindows ストアアプリのgrid viewを入門してみた
Windows ストアアプリのgrid viewを入門してみた
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとか
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
ScalaMatsuri 2016
ScalaMatsuri 2016ScalaMatsuri 2016
ScalaMatsuri 2016
 
Mithril - 軽量/高速なMVCフレームワーク
Mithril - 軽量/高速なMVCフレームワークMithril - 軽量/高速なMVCフレームワーク
Mithril - 軽量/高速なMVCフレームワーク
 
Jqm20120210
Jqm20120210Jqm20120210
Jqm20120210
 
Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発Knockout.js を利用したインタラクティブ web アプリケーション開発
Knockout.js を利用したインタラクティブ web アプリケーション開発
 
jQuery超入門編
jQuery超入門編jQuery超入門編
jQuery超入門編
 

Knockout

Editor's Notes

  1. \n
  2. \n
  3. \n
  4. what is mvvm?\neverybody know MVC pattern.\nlike mvc.\nmvvm is an architectual pattern.\n
  5. \n
  6. \n
  7. view perform only display control. labels,buttons,textareas and so on.\nviewmodel is abstraction of view.\nIt has view state and logic.\ndata binding is used between view and viewmodel\n\nmodel, it&apos;s like domain model.\nmodel has bussines model and logic.\n
  8. \n
  9. \n
  10. show example.\n\nthis span tag is binding to myMessage.\nthis text is changed a new text when you change myMessage of view model.\n
  11. show example.\n\nthis span tag is binding to myMessage.\nthis text is changed a new text when you change myMessage of view model.\n
  12. show example.\n\nthis span tag is binding to myMessage.\nthis text is changed a new text when you change myMessage of view model.\n
  13. show example.\n\nthis span tag is binding to myMessage.\nthis text is changed a new text when you change myMessage of view model.\n
  14. show example.\n\nthis span tag is binding to myMessage.\nthis text is changed a new text when you change myMessage of view model.\n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. show example.\n\nthis span tag is binding to myMessage.\nthis text is changed a new text when you change myMessage of view model.\n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n