SlideShare ist ein Scribd-Unternehmen logo
1 von 98
Downloaden Sie, um offline zu lesen
knockout.jsにknockoutされた話	

2014/02/28	
  Fukuoka	
  Frontend	
  Frogs	
  Ex	
Hiroyuki	
  Tashima
“GGoodd  ffiigghhtt  oonn  tthhee  ssiiddee	
      wwiitthh  tthhee  bbeesstt  FFrraammeewwoorrkk..”	
      --  NNaappoolleeoonn  BBoonnaappaarrttee	
神は最高のフレームワークを使う側に味方する
-  ナポレオン・ボナパルト
まずはじめに
は?誰?
【自己紹介】	

	

田 fb	
hiroyuki.tashima	
島
@HiroyukiTashima	
寛 ・日本唐揚協会公認カラアゲニスト	
  
・株式会社gumi	
  West	
  
之 ・フロントエンドエンジニア	
  
knockout.jsにknockoutされた話
なぜ

knockout.js  ?
まずはこちらを
ご覧いただきたい
(・ワ・) :	
  福岡出張中のHさん(仮)
たしま:(・ε・)
(・ワ・)
たしまさん、knockout.jsってフレームワーク
使いませんか?
ア、イイデスネー > (・ε・)
(・ワ・)
knockout.jsだとかなりコード量減って
いい感じになりますよ〜
ア、イイデスネー > (・ε・)
(・ワ・)
たしまさんって何かフレームワーク使ってます?
ア、イイデスネー > (・ε・)
要約
表示物、データ多い
表示物、データ多い
+
DOM操作も多い
表示物、データ多い
+
DOM操作も多い
↓
js長くなる
表示物、データ多い
+
DOM操作も多い
↓
js長くなる
↓
(´・ω・`)わけわかめ
よわい(確信)
表示物、データ多い
表示物、データ多い
+
DOM操作も多い
表示物、データ多い
+
DOM操作も多い
↓
knockout.jsを使う
表示物、データ多い
+
DOM操作も多い
↓
knockout.jsを使う
↓
コード量:減 動作:軽
つよい(確信)
で、knockout.jsを使うことに…
そもそも

knockout.jsとは?
knockout.jsとは?
knockout.jsは
データモデルを基盤とし、
リッチなUI構築を行う目的で開発された
JavaScriptライブラリである。
wikipediaのコピペを貼るんじゃあないよ!

> (・ε・#)
 knockout.js
・UI用JavaScriptライブラリ
・jQuery等の別ライブラリとぶつからない
・MVVM(Model,  View,  ViewModel)
・DOM操作に関するコードがほぼいらない
・軽い(動作、容量)
 knockout.js
  3大ポイント 
 knockout.js
・MVVM
 Model  :  Ajaxから受け取ったデータ
 View  :  HTML
 ViewModel  :  ページ内で一時的に使用、変更するデータ
 knockout.js
・View(HTML)からbind指定
 click,  style,  css,  attr,  …
 knockout.js
・常に変数の変化を監視(observable)
概要だけじゃよく分からんすなぁ

> (・ε・)
使用例
テキスト入力  +  ボタンclick  
  ↓
  window  &  テキスト表示
つまり

テキスト入力
ボタンclick
こうなる

ウィンドウ表示

テキスト表示
knockout.jsを使わない場合
HTML
<div	
  id="main">	
  
	
  	
  	
  	
  	
  	
  	
  	
  <input	
  type="text"	
  id="inputForm"></input>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <buKon	
  onclick="openPopup()">	
  o	
  p	
  e	
  n	
  </buKon>	
  
</div>	
  
<div	
  id="popup"	
  style="display:none">	
  
	
  	
  	
  	
  <div	
  style="opacity:1;">	
  
	
  	
  	
  	
  	
  	
  	
  	
  <font	
  color="#ffffff">popupWindow</font><br	
  />	
  
	
  	
  	
  	
  	
  	
  	
  	
  <div	
  style="color:#ffffff;">input.value	
  :	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <span	
  id="inputResult"></span>	
  
	
  	
  	
  	
  	
  	
  	
  	
  </div>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <buKon	
  onclick="closePopup()">	
  c	
  l	
  o	
  s	
  e	
  </buKon>	
  
	
  	
  	
  	
  </div>	
  
</div>
HTML
JavaScriptでDOM取得するための
id、class指定が必要
JavaScript

var	
  popup	
  =	
  document.getElementById("popup");	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
var	
  input	
  =	
  
	
  	
  	
  	
  document.getElementById("inputForm");	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
var	
  inputResult	
  =	
  
	
  	
  	
  	
  document.getElementById("inputResult");	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
funcVon	
  openPopup(){	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  inputResult.innerHTML	
  =	
  input.value;	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  popup.style.display="block";	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
}	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
funcVon	
  closePopup(){	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  popup.style.display="none";	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
}	
  
JavaScript
・DOM  elementの取得
・styleの変更
・innerHTMLで変更
(´・ω・`)うーん…
 

使

	

!

Knockout.js

	
  
	
!

聞話
knockout.jsを使った場合
JavaScript
変数をkoの監視対象に設定
funcVon	
  AppViewModel(){	
  
	
  	
  	
  	
  this.popupVisible	
  =	
  ko.observable(false);	
  
	
  	
  	
  	
  this.inputValue	
  =	
  ko.observable("");	
  
}	
  
	
  
ko.applyBindings(new	
  AppViewModel());	

koを作動させる(第二引数なし→document全体が対象)
JavaScript
ViewModelの作成
変数の宣言&監視対象化
bindingしてkoを作動
HTML
<div="main">	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  <input	
  type="text"	
  data-­‐bind="value:	
  inputValue"></input>	
  
	
  	
  	
  	
  <buKon	
  data-­‐bind="click:	
  popupVisible(true)">	
  o	
  p	
  e	
  n	
  </buKon>	
  
</div>	
  
変数をGET
<div	
  id="popup"	
  	
  
	
  	
  	
  	
  data-­‐bind="style:	
  {display:	
  popupVisible()	
  ?	
  'block'	
  :	
  'none'	
  }">	
  	
  
	
  	
  	
  	
  <div	
  style="opacity:1;">	
  
	
  	
  	
  	
  	
  	
  	
  	
  <font	
  color="#ffffff">popupWindow</font><br	
  />	
  
	
  	
  	
  	
  	
  	
  	
  	
  <div	
  style="color:#ffffff;">input.value	
  :	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <span	
  data-­‐bind="text:	
  inputValue()"></span></div>	
  
	
  	
  	
  	
  	
  	
  	
  	
  <buKon	
  data-­‐bind="click:	
  popupVisible(false)">	
  c	
  l	
  o	
  s	
  e	
  </buKon>	
  
	
  	
  	
  	
  </div>	
  
</div>	

変数をSET
HTML
data-bind属性で関連付け
(koで監視中の変数とリンク)
DOM取得用のid,  class不要
変数名()  :  getter
変数名(value)  :  setter
Before

var	
  popup	
  =	
  document.getElementById("popup");	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
var	
  input	
  =	
  
	
  	
  	
  	
  document.getElementById("inputForm");	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
var	
  inputResult	
  =	
  
	
  	
  	
  	
  document.getElementById("inputResult");	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
funcVon	
  openPopup(){	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  inputResult.innerHTML	
  =	
  input.value;	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  popup.style.display="block";	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
}	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
funcVon	
  closePopup(){	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  popup.style.display="none";	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
}	
  
After
funcVon	
  AppViewModel(){	
  
	
  	
  	
  	
  this.popupVisible	
  =	
  ko.observable(false);	
  
	
  	
  	
  	
  this.inputValue	
  =	
  ko.observable("");	
  
}	
  
ko.applyBindings(new	
  AppViewModel());
圧倒的ではないか

  knockout.jsは
次
Ajax通信(jQueryを使用)
  ↓
  適当に表示物を更新
HTML

<div	
  id="main">	
  
	
  	
  	
  	
  	
  	
  	
  	
  <buKon	
  data-­‐bind="click:	
  ajaxStart">	
  Ajax	
  Start	
  </buKon>	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  </div>	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  <div	
  id="popup"	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  data-­‐bind="style:	
  {display:	
  popupVisible	
  ?	
  'block'	
  :	
  'none'	
  }">	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  <div	
  style="opacity:1;">	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <font	
  color="#ffffff">popupWindow</font><br	
  />	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <div	
  style="color:#ffffff;">ajax	
  data<br	
  />	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <span	
  data-­‐bind="text:	
  ajaxData"></span></div>	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <buKon	
  data-­‐bind="click:	
  popupVisible(false)	
  ">close</buKon>	
  
	
  	
  	
  	
  	
  	
  	
  	
  </div>	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  </div>
JavaScript  (一部)
funcVon	
  AppViewModel(){	
  
	
  	
  	
  	
  var	
  self	
  =	
  this;	
  
	
  	
  	
  	
  self.popupVisible	
  =	
  ko.observable(false);	
  
	
  	
  	
  	
  self.ajaxData	
  =	
  ko.observable();	
  
	
  	
  	
  	
  self.ajaxStart	
  =	
  funcVon(){	
  
	
  	
  	
  	
  	
  	
  	
  	
  $.ajax({	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  url:	
  “tset”,	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  type:	
  ”GET",	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  success:	
  funcVon	
  (json){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  jsonObj	
  =	
  ko.toJS(json);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  self.ajaxData(jsonObj)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  self.popupVisible(true);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  })	
  
	
  	
  	
  	
  }	
  
}	
  

ko.applyBindings(new	
  AppViewModel());
knockout.js?
ボコボコにしてやんよー
 ∧_∧
(  ・ω・)=つ≡つ
(っ  ≡つ=つ
`/  )  ババババ
(ノ ̄∪
(って思うでしょう?)
あれ?動かない…
なぜだ、なぜ動かん…
 knockout.js
よくある落とし穴 
knockout.jsの落とし穴
監視中(observable)の変数
getterとsetterをよく間違える!
knockout.jsの落とし穴
監視中(observable)の変数
getterとsetterをよく間違える!
getter  → test_value()
setter  → test_value(val)
knockout.jsの落とし穴
しかも
knockout.jsの落とし穴
しかも
<input	
  type="text"	
  data-­‐bind="value:	
  inputValue"></input>	
  

valueへのbindはgetterの()は不要
knockout.jsの落とし穴
しかも
<input	
  type="text"	
  data-­‐bind="value:	
  inputValue"></input>	
  

valueへのbindはgetterの()は不要
data-­‐bind=“style:	
  {display:	
  popupVisible()	
  ?	
  ‘block’	
  :	
  ‘none’	
  }	
  "	
  	

でもこいつ↑には()必要
knockout.jsの落とし穴
しかも
<input	
  type="text"	
  data-­‐bind="value:	
  inputValue"></input>	
  

valueへのbindはgetterの()は不要
data-­‐bind=“style:	
  {display:	
  popupVisible()	
  ?	
  ‘block’	
  :	
  ‘none’	
  }	
  "	
  	

でもこいつ↑には()必要
(#	
  ゚Д゚) <	
  紛らわしいんじゃーい!
事態は見えてきた、後は簡単だ
あれ?また動かない…
なぜだ、なぜ(ry
knockout.jsの落とし穴
同変数の監視化(ko.observable)は
2回目以降はスルーされる
knockout.jsの落とし穴
同変数の監視化(ko.observable)は
2回目以降はスルーされる
funcVon	
  AppViewModel(){	
  
	
  	
  	
  	
  this.popupVisible	
  =	
  ko.observable(false);	
  
	
  	
  	
  	
  this.popupVisible	
  =	
  ko.observable(true);	
  
}	
  

2回目はスルーされるのでfalseのまま
knockout.jsの落とし穴
ko.observableは1回のみ。
変数への代入はsetterで指定!
funcVon	
  AppViewModel(){	
  
	
  	
  	
  	
  this.popupVisible	
  =	
  ko.observable(false);	
  
	
  	
  	
  	
  this.popupVisible(true);	
  
}	
  

setterで変数の内容変更
事態は見えて(ry
あれ?また…
五飛教えてくれ。俺は後何回画像を張ればいい…?
 俺はあと何回パプテマス様の画像を張ればいいんだ?

knockout.jsは俺に何も言ってはくれない…
                                                         教えてくれ、五飛!  
knockout.jsの落とし穴
ko.applyBinding(koの作動)で
要素に指定できるViewModelは一つのみ
※applyBindingの第二引数で
DOM要素を指定可能※
※applyBindingの第二引数を指定しないと
document全体が対象となる※
knockout.jsの落とし穴
ko.applyBinding(koの作動)は
指定できるViewModelは一つのみ
ko.applyBindings(new	
  AppTestModel1());	
ko.applyBindings(new	
  AppTestModel2());	
同要素(document全体)2つはできんのだよ
knockout.jsの落とし穴
対応策
knockout.jsの落とし穴
対応策
ViewModelを一つのみにする
knockout.jsの落とし穴
対応策
ViewModelを一つのみにする
or
オブジェクトを作り、
それにViewModelをつなげる
knockout.jsの落とし穴
対応策
ViewModelを一つのみにする
or
オブジェクトを作り、
それにViewModelをつなげる
or
DOM指定で範囲を分ける
さすがにもうこれ以上

ひっかかることは
あっ

※お察し下さい※
knockout.jsまとめ
•  JavaScriptコード量が大幅に減る
•  HTML(View)との関連づけが簡単
•  動作がすごく軽い
•  大規模になると面倒くさい面が
こんな長いコード(500行)が
	
  	
  funcVon	
  draw(){	
  
	
  	
  	
  	
  	
  	
  	
  	
  //draw	
  map	
  
	
  	
  	
  	
  	
  	
  	
  	
  //draw	
  window	
  
//	
  	
  	
  	
  	
  	
  	
  	
  ctx.fillRect(0,	
  0,	
  SCREEN_WIDTH,	
  SCREEN_HEIGHT);	
  
	
  	
  	
  	
  	
  	
  	
  	
  ctx.clearRect(0,	
  0,	
  SCREEN_WIDTH,	
  SCREEN_HEIGHT);	
  
	
  	
  	
  	
  	
  	
  	
  	
  var	
  buff	
  =	
  0;	
  
	
  	
  	
  	
  	
  	
  	
  	
  if(imageDrag){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  buff	
  =	
  xDis	
  /	
  400	
  *	
  Math.PI	
  *	
  (-­‐1);	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  for(i	
  =	
  0;	
  i	
  <	
  IMG_NUM;	
  i++){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  renderOrder[i]	
  =	
  i;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if((flagInfo[renderOrder[i]].rad	
  +	
  buff)	
  <	
  0){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  flagInfo[renderOrder[i]].rad	
  =	
  flagInfo[renderOrder[i]].rad	
  +	
  Math.PI	
  *	
  circleMode;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  else	
  if((flagInfo[renderOrder[i]].rad	
  +	
  buff)	
  >	
  (Math.PI	
  *	
  circleMode)){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  flagInfo[renderOrder[i]].rad	
  =	
  flagInfo[renderOrder[i]].rad	
  -­‐	
  Math.PI	
  *	
  circleMode;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  //sort	
  for	
  render	
  
	
  	
  	
  	
  	
  	
  	
  	
  for(i	
  =	
  0;	
  i	
  <	
  IMG_NUM	
  -­‐	
  1;	
  i++){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  for(j	
  =	
  (i	
  +	
  1);	
  j	
  <	
  IMG_NUM;	
  j++){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(Math.abs(Math.PI	
  /	
  2	
  -­‐	
  (flagInfo[renderOrder[i]].rad	
  +	
  buff))	
  <	
  Math.abs(Math.PI	
  /	
  2	
  -­‐	
  
(flagInfo[renderOrder[j]].rad	
  +	
  buff))){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  tmp;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  tmp	
  =	
  renderOrder[i];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  renderOrder[i]	
  =	
  renderOrder[j];	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  renderOrder[j]	
  =	
  tmp;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  
	
  	
  	
  	
  	
  	
  	
  	
  for(i	
  =	
  0;	
  i	
  <	
  IMG_NUM;	
  i++){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ((flagInfo[renderOrder[i]].rad	
  +	
  buff)	
  >	
  (Math.PI	
  /	
  12))&&	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ((flagInfo[renderOrder[i]].rad	
  +	
  buff)	
  <	
  (Math.PI	
  /	
  12	
  *	
  11))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  )	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  mag	
  =	
  ZOOM_MIN;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  temp	
  =	
  Math.abs((flagInfo[renderOrder[i]].rad	
  +	
  buff)	
  -­‐	
  Math.PI	
  /	
  2);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(temp	
  <	
  ZOOM_RANGE){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  mag	
  =	
  mag	
  +(ZOOM_RANGE	
  -­‐	
  	
  temp	
  /	
  ZOOM_RANGE)	
  *	
  ZOOM_MAX;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ctx.drawImage(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  drawFlagObj[renderOrder[i]],	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  parseInt(RADIUS_SIDE	
  *	
  Math.cos(flagInfo[renderOrder[i]].rad	
  +	
  buff)	
  +	
  CENTER_X	
  -­‐	
  
drawFlagObj[renderOrder[i]].width	
  /	
  2	
  /	
  2	
  *	
  mag),	
  

	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  parseInt(RADIUS_LENGTH	
  *	
  Math.sin(flagInfo[renderOrder[i]].rad	
  +	
  buff)	
  +	
  CENTER_Y	
  -­‐	
  
drawFlagObj[renderOrder[i]].height	
  /	
  2	
  /	
  2	
  *	
  mag),	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  parseInt(drawFlagObj[renderOrder[i]].width	
  /	
  2	
  *	
  mag),	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  parseInt(drawFlagObj[renderOrder[i]].height	
  /	
  2	
  *	
  mag)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  );	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  centerImageNo	
  =	
  flagInfo[renderOrder[IMG_NUM	
  -­‐	
  1]].imageNo;	
  
	
  	
  	
  	
  	
  	
  	
  	
  if(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (mapState	
  ==	
  NORMAL)&&	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (imageDrag	
  ==	
  false)	
  
	
  	
  	
  	
  	
  	
  	
  	
  )	
  
	
  	
  	
  	
  	
  	
  	
  	
  {	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  ctx.drawImage(	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  drawArrowObj[0],	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  parseInt(50),	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  parseInt((SCREEN_HEIGHT	
  /	
  2)	
  -­‐	
  drawArrowObj[0].height	
  /	
  2	
  +	
  7),	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  parseInt(drawArrowObj[0].width	
  /	
  2),	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  parseInt(drawArrowObj[0].height	
  /	
  2)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  );	
  
	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  }	
  
	
  //main	
  loop	
  
	
  	
  	
  	
  funcVon	
  mainLoop(){	
  
	
  	
  	
  	
  	
  	
  	
  	
  var	
  drawInterval	
  =	
  setInterval(funcVon(){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(mapState	
  ==	
  AUTO_MOVE){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  for(i	
  =	
  0;	
  i	
  <	
  IMG_NUM;	
  i++){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  flagInfo[i].rad	
  +=	
  autoMoveRad;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  autoMoveFrame++;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  if(autoMoveFrame	
  >=	
  AUTO_MOVE_FRAME){	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  autoMoveFrame	
  =	
  0;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  mapState	
  =	
  NORMAL;	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  //change	
  map	
  detail	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  temp	
  =	
  $(".flagTitle");	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  temp2	
  =	
  $("#VtleViewer");	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  element	
  =	
  temp[centerImageNo].cloneNode(true);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  temp2.empty();	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  temp2.append(element);	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  }	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  draw();	
  
	
  	
  	
  	
  	
  	
  	
  	
  },	
  1000	
  /	
  FPS);	
  
	
  	
  	
  	
  }	
  
	
  
}).call(this);	
  
こうなる!(イメージ)
funcVon	
  AppViewModel(){	
  
	
  	
  	
  	
  var	
  self	
  =	
  this;	
  
	
  	
  	
  	
  self.popupVisible	
  =	
  ko.observable(false);	
  
	
  	
  	
  	
  self.viewWindow	
  =	
  ko.observable(0);	
  
	
  	
  	
  	
  $(“#statusWIndow”).swipeRight{	
  
	
  	
  	
  	
  	
  	
  	
  	
  viewWindow(viewWindow()++);	
  
	
  	
  	
  	
  }	
  	
  
	
  	
  	
  	
  $(“#statusWIndow”).swipeLe}{	
  
	
  	
  	
  	
  	
  	
  	
  	
  viewWindow(viewWindow()-­‐-­‐);	
  
	
  	
  	
  	
  }	
  	
  
}	
  

ko.applyBindings(new	
  AppViewModel());
そう、knockout.jsならね
もうこれで使えるはず!
                                 ,.へ 	
  ___	
                              ム  i	
  	
  
 「 ヒ_i〉                            ゝ 〈	
  	
  
 ト ノ                           iニ(()	
  	
  
 i	
   {	
               ____	
            |	
   ヽ 	
 i  i           /__,  ,	
  -­‐-­‐\           i	
    }	
  	
  
 |   i         /(●)	
    (	
  ●	
  )	
  	
  	
  	
  \       {、  λ	
  	
  
 ト-┤.      /    (__人__)  \    ,ノ  ̄ ,!	
  	
  
 i   ゝ、_	
      |     ´ ̄`	
        | ,.	
  '´ハ   ,!	
  	
  
. ヽ、    `` 、,__\              /" \  ヽ/ 	
   \ノ ノ   ハ ̄r/:::r―-­‐-­‐―/::7   ノ    / 	
       ヽ.      ヽ::〈; .	
  '::.	
  :'	
  |::/   /   ,.	
  "	
  	
  
        `ー 、    \ヽ::.	
  ;:::|/     r'"	
  	
  
     / ̄二二二二二二二二二二二二二二二二ヽ 	
     |	
  答 |     k	
  n	
  o	
  c	
  k	
  o	
  u	
  t	
  .	
  j	
  s        │|	
  	
  
     \_二二二二二二二二二二二二二二二二ノ
別にアレをknockoutしても構わんだろう
もう何も怖くないし
ちょっと川の様子を見てくるよ!
   /     /     /      /  /	
   /	
  /	
  
/     /     /     /     /	
    /	
  
             ビュー   ,.、	
  ,.、    /   /	
  
    /    /       ∠二二、ヽ    / /	
  
  /    /   /   (( ´・ω・`)) 	
  	
  	
  	
  	
  	
  /	
  	
  	
  	
  /	
               / ~~	
  :~~~〈   /	
  
       /    / ノ   : _,,..ゝ   /	
  
    /    /     (,,..,)二i_,∠	
   /    /
fin.
次回に続く!

Weitere ähnliche Inhalte

Was ist angesagt?

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
 
Knockout を用いた Firefox OS アプリケーションの開発
Knockout を用いた Firefox OS アプリケーションの開発Knockout を用いた Firefox OS アプリケーションの開発
Knockout を用いた Firefox OS アプリケーションの開発Kentaro Iizuka
 
jQuery Mobile 1.3 最新情報
jQuery Mobile 1.3 最新情報jQuery Mobile 1.3 最新情報
jQuery Mobile 1.3 最新情報yoshikawa_t
 
Twitter連携chrome extension作り方
Twitter連携chrome extension作り方Twitter連携chrome extension作り方
Twitter連携chrome extension作り方Hiroshi Oyamada
 
プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話Shohei Okada
 
jQuery Mobile 1.2 最新情報 & Tips
jQuery Mobile 1.2 最新情報 & TipsjQuery Mobile 1.2 最新情報 & Tips
jQuery Mobile 1.2 最新情報 & Tipsyoshikawa_t
 
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)a know
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義ria1201
 
Creators'night#12今井
Creators'night#12今井Creators'night#12今井
Creators'night#12今井Daisuke Imai
 
日本Androidの会 中国支部資料
日本Androidの会 中国支部資料日本Androidの会 中国支部資料
日本Androidの会 中国支部資料Masafumi Terazono
 
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvmT90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm伸男 伊藤
 
AngularJSとの危険な関係 by Mario Heiderich - CODE BLUE 2015
AngularJSとの危険な関係 by Mario Heiderich - CODE BLUE 2015AngularJSとの危険な関係 by Mario Heiderich - CODE BLUE 2015
AngularJSとの危険な関係 by Mario Heiderich - CODE BLUE 2015CODE BLUE
 
20111204 WebBroser Control Tips for Windows Phone
20111204 WebBroser Control Tips for Windows Phone20111204 WebBroser Control Tips for Windows Phone
20111204 WebBroser Control Tips for Windows PhoneKenji Wada
 
0406web creators night_DeNA
0406web creators night_DeNA0406web creators night_DeNA
0406web creators night_DeNADeNA_open_events
 
JavaScript超入門 基礎
JavaScript超入門 基礎JavaScript超入門 基礎
JavaScript超入門 基礎tetsu6
 
Jetpack Library 事始め
Jetpack Library 事始めJetpack Library 事始め
Jetpack Library 事始めTomohiro Kaizu
 

Was ist angesagt? (20)

Mvpvm pattern
Mvpvm patternMvpvm pattern
Mvpvm pattern
 
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイドFrom Swing to JavaFX  - SwingからJavaFXへのマイグレーションガイド
From Swing to JavaFX - SwingからJavaFXへのマイグレーションガイド
 
Knockout を用いた Firefox OS アプリケーションの開発
Knockout を用いた Firefox OS アプリケーションの開発Knockout を用いた Firefox OS アプリケーションの開発
Knockout を用いた Firefox OS アプリケーションの開発
 
Scene BuilderでFXML
Scene BuilderでFXMLScene BuilderでFXML
Scene BuilderでFXML
 
jQuery Mobile 1.3 最新情報
jQuery Mobile 1.3 最新情報jQuery Mobile 1.3 最新情報
jQuery Mobile 1.3 最新情報
 
Twitter連携chrome extension作り方
Twitter連携chrome extension作り方Twitter連携chrome extension作り方
Twitter連携chrome extension作り方
 
プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話プロダクトに 1 から Vue.js を導入した話
プロダクトに 1 から Vue.js を導入した話
 
jQuery Mobile 1.2 最新情報 & Tips
jQuery Mobile 1.2 最新情報 & TipsjQuery Mobile 1.2 最新情報 & Tips
jQuery Mobile 1.2 最新情報 & Tips
 
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
はじめよう JavaFX 2.x(第3回 岡山Javaユーザー会)
 
Apexデザインパターン
ApexデザインパターンApexデザインパターン
Apexデザインパターン
 
EC-CUBEプラグイン講義
EC-CUBEプラグイン講義EC-CUBEプラグイン講義
EC-CUBEプラグイン講義
 
Creators'night#12今井
Creators'night#12今井Creators'night#12今井
Creators'night#12今井
 
20120118 titanium
20120118 titanium20120118 titanium
20120118 titanium
 
日本Androidの会 中国支部資料
日本Androidの会 中国支部資料日本Androidの会 中国支部資料
日本Androidの会 中国支部資料
 
T90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvmT90 きっと怖くないmvvm & mvpvm
T90 きっと怖くないmvvm & mvpvm
 
AngularJSとの危険な関係 by Mario Heiderich - CODE BLUE 2015
AngularJSとの危険な関係 by Mario Heiderich - CODE BLUE 2015AngularJSとの危険な関係 by Mario Heiderich - CODE BLUE 2015
AngularJSとの危険な関係 by Mario Heiderich - CODE BLUE 2015
 
20111204 WebBroser Control Tips for Windows Phone
20111204 WebBroser Control Tips for Windows Phone20111204 WebBroser Control Tips for Windows Phone
20111204 WebBroser Control Tips for Windows Phone
 
0406web creators night_DeNA
0406web creators night_DeNA0406web creators night_DeNA
0406web creators night_DeNA
 
JavaScript超入門 基礎
JavaScript超入門 基礎JavaScript超入門 基礎
JavaScript超入門 基礎
 
Jetpack Library 事始め
Jetpack Library 事始めJetpack Library 事始め
Jetpack Library 事始め
 

Ähnlich wie Knocked out in knockout js

あの時AngularJSと出会った僕らは
あの時AngularJSと出会った僕らはあの時AngularJSと出会った僕らは
あの時AngularJSと出会った僕らはMuyuu Fujita
 
JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤Yuichi Sakuraba
 
CSS Nite in Matsuyama vol.1 - session 4
CSS Nite in Matsuyama vol.1 - session 4 CSS Nite in Matsuyama vol.1 - session 4
CSS Nite in Matsuyama vol.1 - session 4 arisu yano
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会Yukihiro Kitazawa
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Yuki Higuchi
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとかyouku
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)Fujio Kojima
 
プロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメプロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメNorito Agetsuma
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-Kazunari Hara
 
WebViewでエラーページを表示する話
WebViewでエラーページを表示する話WebViewでエラーページを表示する話
WebViewでエラーページを表示する話Tetsuya Kaneuchi
 
20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック良太 増子
 

Ähnlich wie Knocked out in knockout js (20)

Visualforce + jQuery
Visualforce + jQueryVisualforce + jQuery
Visualforce + jQuery
 
Try Jetpack
Try JetpackTry Jetpack
Try Jetpack
 
あの時AngularJSと出会った僕らは
あの時AngularJSと出会った僕らはあの時AngularJSと出会った僕らは
あの時AngularJSと出会った僕らは
 
JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤JavaFX 2.0 - リッチクライアントのためのUI基盤
JavaFX 2.0 - リッチクライアントのためのUI基盤
 
Lt 111119
Lt 111119Lt 111119
Lt 111119
 
CSS Nite in Matsuyama vol.1 - session 4
CSS Nite in Matsuyama vol.1 - session 4 CSS Nite in Matsuyama vol.1 - session 4
CSS Nite in Matsuyama vol.1 - session 4
 
jQuery超入門編
jQuery超入門編jQuery超入門編
jQuery超入門編
 
20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会20130924 Picomon CRH勉強会
20130924 Picomon CRH勉強会
 
Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.Android Lecture #03 @PRO&BSC Inc.
Android Lecture #03 @PRO&BSC Inc.
 
Knockout
KnockoutKnockout
Knockout
 
Jetpack Workshop
Jetpack WorkshopJetpack Workshop
Jetpack Workshop
 
ScaLa+Liftとか
ScaLa+LiftとかScaLa+Liftとか
ScaLa+Liftとか
 
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)「Windows 8 ストア アプリ開発 tips」  hokuriku.net vol.11 (2013年1月26日)
「Windows 8 ストア アプリ開発 tips」 hokuriku.net vol.11 (2013年1月26日)
 
OSC京都2011
OSC京都2011OSC京都2011
OSC京都2011
 
プロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメプロになるためのJavaScript入門読書会 レジュメ
プロになるためのJavaScript入門読書会 レジュメ
 
JavaFX 2.0 への誘い
JavaFX 2.0 への誘いJavaFX 2.0 への誘い
JavaFX 2.0 への誘い
 
速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-速くなければスマフォじゃない - インターンバージョン-
速くなければスマフォじゃない - インターンバージョン-
 
WebViewでエラーページを表示する話
WebViewでエラーページを表示する話WebViewでエラーページを表示する話
WebViewでエラーページを表示する話
 
20110714 j queryベーシック
20110714 j queryベーシック20110714 j queryベーシック
20110714 j queryベーシック
 
Blocksの活用法
Blocksの活用法Blocksの活用法
Blocksの活用法
 

Kürzlich hochgeladen

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Hiroshi Tomioka
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video UnderstandingToru Tamaki
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptxsn679259
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。iPride Co., Ltd.
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Gamesatsushi061452
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルCRI Japan, Inc.
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイスCRI Japan, Inc.
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NTT DATA Technology & Innovation
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...Toru Tamaki
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsWSO2
 

Kürzlich hochgeladen (12)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 

Knocked out in knockout js