Slide 1

Slide 1 text

knockout.js 入門 - 鬼畜編 しばやん (@shibayan)

Slide 2

Slide 2 text

About  しばやん (@shibayan)  ピュア紳士  STEINS;GATE と Ever17 が好き  C# と ASP.NET MVC が好き  3/31 までは ASP.NET/IIS の MVP

Slide 3

Slide 3 text

Introduction Knockout  HTML と JavaScript で MVVM  はっきりいって、よくわからない  公式の Core Concepts  Declarative Bindings  Automatic UI Refresh  Dependency Tracking  Templating

Slide 4

Slide 4 text

Declarative Bindings  data-bind 属性を利用した、宣言的な バインディング定義

Slide 5

Slide 5 text

Automatic UI Refresh  モデルの値が変更された時、自動的 に UIを更新

Slide 6

Slide 6 text

Dependency Tracking  モデル間の依存関係を自動的に追跡 lastName と firstName のどちらかが変更された 場合でも、このプロパティの変更通知が飛ぶ

Slide 7

Slide 7 text

Templating  モデルの値から UI 要素を動的に生成 template

Slide 8

Slide 8 text

Subscribable  ko.subscribable  subscribe  getSubscriptionCount  extend  Observables は Subscribable を継承  値の変更を検知可能

Slide 9

Slide 9 text

Observables  ko.observable  ko.observableArray  ko.computed ko.observable("initial value") ko.observableArray([ 1, 2, 3, 4, 5 ]); ko.computed(function () { return this.lastName() + " " + this.firstName(); }, viewModel);

Slide 10

Slide 10 text

ViewModel(1)  Object Literal var viewModel = { firstName: ko.observable(), lastName: ko.observable() }; viewModel.fullName = ko.computed(function () { return this.lastName() + " " + this.firstName(); }, viewModel);

Slide 11

Slide 11 text

ViewModel(2)  Function function MyViewModel() { var self = this; self.firstName = ko.observable(); self.lastName = ko.observable(); self.fullName = ko.computed(function () { return self.lastName() + " " + self.firstName(); }); }

Slide 12

Slide 12 text

Fluent Interface  setter は所属する ViewModel を返す var viewModel = { firstName: ko.observable(), lastName: ko.observable() }; viewModel.lastName("鳳凰院").firstName("凶真");

Slide 13

Slide 13 text

Activating  ko.applyBindings // 全ての要素を対象にする ko.applyBindings(viewModel); // #elementId 以下の要素を対象にする ko.applyBindings(viewModel, document.getElementById("elementId"));

Slide 14

Slide 14 text

Bulit-in Bindings - Text  text  html

Slide 15

Slide 15 text

Built-in Bindings - Appearance  visible  css  style  attr

      Slide 16

      Slide 16 text

      Built-in Bindings - Event  click  event  submit click me

      Slide 17

      Slide 17 text

      Built-in Bindings - Control Flow  foreach  if / ifnot  with
      Error
      ...
      ...

      Slide 18

      Slide 18 text

      Built-in Bindings – Forms(1)  value  checked  options

      Slide 19

      Slide 19 text

      Built-in Bindings – Forms(2)  selectedOptions  enable / disable  hasfocus ...

      Slide 20

      Slide 20 text

      Demo(1)  基本的な knockout.js の使い方  Observables  ViewModel  Built-in Bindings

      Slide 21

      Slide 21 text

      Custom Bindings  ko.bindingHandlers ko.bindingHandlers.fadeVisible = { init: function (element, valueAccessor) { var value = ko.utils.unwrapObservable(valueAccessor()); $(element).toggle(value); }, update: function (element, valueAccessor) { var value = ko.utils.unwrapObservable(valueAccessor()); if (value) $(element).fadeIn(); else $(element).fadeOut(); } };

      Slide 22

      Slide 22 text

      Unobtrusive Event Handling  ko.dataFor  ko.contextFor var data = ko.dataFor(domElement); var context = ko.contextFor(domElement); // context.($data/$parent/$parents/$root) $(".selector").live("click", function() { // ko.dataFor/contextFor });

      Slide 23

      Slide 23 text

      Extenders  ko.extenders  throttle  指定した時間を経過した時だけ、変更イ ベントを発火する ko.extenders.myExtender = function(target, option) { // target = observable, option: parameter }; var viewModel = { searchTerms: ko.observable() .extend({ throttle: 500 }) };

      Slide 24

      Slide 24 text

      Demo(2)  高度な使い方を試す  Custom Bindings  Unobtrusive Event Handling  Extenders

      Slide 25

      Slide 25 text

      References  Knockout  http://knockoutjs.com/  Steve Sanderson’s blog  http://blog.stevensanderson.com/  Knock Me Out  http://www.knockmeout.net/