Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
TypeScriptでKnockoutを書いてみた
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
shmurakami
May 21, 2014
Programming
1.3k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TypeScriptでKnockoutを書いてみた
http://connpass.com/event/6237/
の資料
shmurakami
May 21, 2014
More Decks by shmurakami
See All by shmurakami
レガシーなPHPの限界とレガシーからの脱却 / phpcon2019
shmurakami
2
3.8k
サーバーサイドから見るChatworkの現状と未来 / Now and future of Chatwork from server side perspective
shmurakami
3
1.4k
php grpc-client in phpcon2018
shmurakami
0
1.8k
lumen e2e test
shmurakami
0
1.1k
decoded_php.pdf
shmurakami
3
820
良心的にまじめに開発するための心構え
shmurakami
0
200
社内勉強会資料 PHPプロジェクトでのJavaScript
shmurakami
0
710
社内勉強会資料 JavaScriptの基本 その1
shmurakami
5
1.9k
Other Decks in Programming
See All in Programming
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
120
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.5k
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
14
5.8k
dRuby over BLE
makicamel
2
390
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
270
さぁV100、メモリをお食べ・・・
nilpe
0
150
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
230
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
140
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
280
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
280
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
320
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
Featured
See All Featured
Paper Plane
katiecoart
PRO
1
52k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
Color Theory Basics | Prateek | Gurzu
gurzu
0
370
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
390
Ruling the World: When Life Gets Gamed
codingconduct
0
260
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
66
55k
Bash Introduction
62gerente
615
220k
Google's AI Overviews - The New Search
badams
0
1k
Transcript
TypeScriptͰ KnockoutΛͬͯΈͨ
自己紹介 ଜ্ढ़հ ࣾͰ։ൃڥͷߏஙΛ ͬͯ͘ΕΔਓͬͯݴΘΕͯ·͢ TL@NSLN TINVSBLBNJ
宣伝タイム
モニプラ for Facebook
ギフト
Allied Architects Engineer Blog
Allied Architects Engineer Blog Knockout.jsೖ http://tech.aainc.co.jp/archives/5346 Knockout.jsೖ ͦͷ2 http://tech.aainc.co.jp/archives/6743
宣伝タイムおわり
TypeScript + Knockoutで 作っています
ギフト ཁٻ༷ 'BDFCPPLͷ༑ୡҰཡΛද ࣔ͢Δ ༑ୡΛબͯ͠ϝοηʔδ Λೖྗ͢Δ ೖྗͨ͠ϝοηʔδΛ༑ୡ ʹૹΔ શͯΛϖʔδͰߦ͏
ギフト ཁٻ༷ 'BDFCPPLͷ༑ୡҰཡΛද ࣔ͢Δ ༑ୡΛબͯ͠ϝοηʔδ Λೖྗ͢Δ ೖྗͨ͠ϝοηʔδΛ༑ୡ ʹૹΔ શͯΛϖʔδͰߦ͏
ギフト ཁٻ༷ 'BDFCPPLͷ༑ୡҰཡΛද ࣔ͢Δ ༑ୡΛબͯ͠ϝοηʔδ Λೖྗ͢Δ ೖྗͨ͠ϝοηʔδΛ༑ୡ ʹૹΔ શͯΛϖʔδͰߦ͏
ギフト ཁٻ༷ 'BDFCPPLͷ༑ୡҰཡΛද ࣔ͢Δ ༑ୡΛબͯ͠ϝοηʔδ Λೖྗ͢Δ ೖྗͨ͠ϝοηʔδΛ༑ୡ ʹૹΔ શͯΛϖʔδͰߦ͏
ギフト ཁٻ༷ 'BDFCPPLͷ༑ୡҰཡΛද ࣔ͢Δ ༑ୡΛબͯ͠ϝοηʔδ Λೖྗ͢Δ ೖྗͨ͠ϝοηʔδΛ༑ୡ ʹૹΔ શͯΛϖʔδͰߦ͏
ギフト +BWB4DSJQUͰෳࡶͳ͜ͱΛ͢ΔͨΊͷڥ͕ ͋·Γඋ͞Ε͍ͯͳ͍
ギフト ͖উखͬͯจ۟ΛݴΘΕͳ͍
ギフト ҎԼͷߏʹ͠·ͨ͠ 5ZQF4DSJQU ,OPDLPVU +BTNJOF HSVOU DPODBUͱNJOJGZ͘Β͍
TypeScript
TypeScript .JDSP4PGU͕։ൃ͍ͯ͠ΔBMU+4 +BWB4DSJQUͷεʔύʔηοτ ʹ͕ϦϦʔε͞Ε·ͨ͠ ࠷৽7FSTJPO ಋೖ࣌Ͱͨ͠
TypeScript ಛ ίϯύΠϧͯ͠+4Λੜ͢Δ ੜ͞ΕΔ+4͕៉ྷͰՄಡੑ͕ߴ͍ ੩తܕ͚Ͱهड़ DMBTTϕʔεͰॻ͚Δ &4ͷ༷Λଟ͘औΓೖΕ͍ͯΔ 4PVSDF.BQରԠ
TypeScript ಛ ίϯύΠϧͯ͠+4Λੜ͢Δ ੜ͞ΕΔ+4͕៉ྷͰՄಡੑ͕ߴ͍ ੩తܕ͚Ͱهड़ DMBTTϕʔεͰॻ͚Δ &4ͷ༷Λଟ͘औΓೖΕ͍ͯΔ 4PVSDF.BQରԠ
TypeScript class Greeter { name: string; constructor(name: string) { this.name
= name; } greet(): string { return "Hello, " + this.name; } }
JavaScriptだとこうなる var Greeter = (function(){ function Greeter(name) { this.name =
name; }; Greeter.prototype.greet = function() { return “Hello, ” + this.name }; return Greeter; })();
TypeScript DMBTTϕʔε DMBTT&DNB4DSJQUͰಋೖ༧ఆ ܕਪ͕͋Γ੩తܕݴޠ ಈతܕݴޠ͕ۤखͳਓ΄Ͳخ͍͠ͷͰ +BWBɺ$Ϣʔβͷํ͕ೃછΈͦ͢͏
TypeScript ੩తܕݴޠ ܕʹΑΔόάʹؾ͖͍ͮ͢ ϦϑΝΫλ͕͍͢͠
TypeScript 4PVSDF.BQରԠͳͷͰ5ZQF4DSJQUͷ·· ϒϥβͰσόοάͰ͖Δ 4PVSDF.BQ 5ZQF4DSJQU4BTTͷΑ͏ʹ+4$44Λੜ ͢ΔݴޠͱมલͷίʔυͱͷରԠؔ Λද͢ϑΝΠϧ
TypeScript {"version": 3,"file":"ts_ko.js","sourceRoot":"","sources": ["ts_ko.ts"],"names": ["Sample","Sample.ViewModel","Sample.ViewModel.c onstructor","Sample.ViewModel.arraySortByValue"] ,"mappings":"AAAA,uDAAuD;;AAOvD,IAAO,MAAM;AAoEZ, CApED,UAAO,MAAM;IArD,EAAE,CAAC,aAAa,CAAC,MAAM,CA AC;AAC5B,CAAC,CAAC,CAAC,CAAC"} 4PVSDF.BQͷத͜Μͳײ͡
None
None
TypeScriptの採用理由 ίϯύΠϥ͕͋Δ ࣌+BWB4DSJQUʹ͍ͭͯશ͘ৄ͘͠ͳ ͔ͬͨͷ࣮͋ͬͯߦલʹΤϥʔΛࣔͯ͠ ͘ΕΔͱخ͔ͬͨ͠ ͰͪΐͬͱίϯύΠϧ͕͍
TypeScriptの採用理由 class Hoge { num: number; constructor() { this.num =
“string!!!”; } }
TypeScriptの採用理由 ៉ྷͳ+4͕ੜ͞ΕΔ ԿΒ͔ͷཧ༝Ͱ5ZQF4DSJQU͕͑ͳ͘ͳ ͬͯܧଓͯ͠ϝϯς͕͍͢͠
TypeScriptの採用理由 var Greeter = (function(){ function Greeter(name) { this.name =
name; }; Greeter.prototype.greet = function() { return “Hello, ” + this.name }; return Greeter; })();
TypeScript ಋೖϝϦοτ ૉͷ+BWB4DSJQUΑΓॻ͖͘͢։ൃޮ ্͕ ίϯύΠϥʹΤϥʔݕͯ͠Β࣮ͬͯߦ ͯ֬͠ೝ͢Δख͕ؒݮͬͨ
TypeScript ಋೖϝϦοτ ៉ྷͳ+BWB4DSJQU͕ੜ͞Εͯ 5ZQF4DSJQU͕͑ͳ͘ͳͬͯϝϯς͠ ͍͢ͷͰউखʹಋೖͰ͖Δ +4ͷهड़ํ๏ʹ׳Ε͍ͯͳͯ͘औͬ ͖қ͍ +4Λ֮͑ͳ͍͍ͯ͘Θ͚͡Όͳ͍
TypeScript ಋೖϝϦοτ 5ZQF4DSJQU͔Βੜ͞ΕΔ+BWB4DSJQUΛ ࢀߟʹͯ͠ྑ͍+BWB4DSJQUͷॻ͖ํͷํ ͕͔ͬͨ
TypeScript ಋೖσϝϦοτ 5ZQF4DSJQUࣗମͷมߋͷӨڹ͕େ͖͍ ్தͰܥʹΞοϓσʔτ͞Εͯվम ͕େมͰͨ͠ ܥʹͳͬͨͷͰ͜ͷ৺͋·Γແ͍ ։ൃڥͷҧ͍ͰࠔΔ ίϯύΠϧڥͷҧ͍ͰΤϥʔʹͳͬͨ Γɺͦͦ։ൃڥ͕ແ͍ਓ͕͍Δ
TypeScript ࢀߟϦϯΫ ຊՈ IUUQXXXUZQFTDSJQUMBOHPSH ΫΠοΫΨΠυ ߋ৽ࢭ·ͬͯΔʁ IUUQQIZ[LJUOFUUZQFTDSJQU 5ZQF4DSJQUϦϑΝϨϯε
TypeScriptリファレンス TypeScript 1.0ରԠ TypeScript͚ͩͰͳ͘ JavaScriptʹ͍ͭͯղઆ ͞Ε͍ͯΔ͔ͳΓΦεε ϝͳ1 ஶऀ: Θ͔Ί·͞ͻΖ ͞Μ
Knockout
フレームワークの選定 ओͳϑϨʔϜϫʔΫ "OHVMBS+4 #BDLCPOFKT ,OPDLPVU
フレームワークの選定 #BDLCPOFKT େن͚ͳΠϝʔδ σʔλόΠϯυ͕ͮ͠Β͍ ݸਓతʹॻ͖ํ͕ۤख
"OHVMBS+4 ,OPDLPVUͷॲཧ͕͍ܰ ͱࢥ͍ͬͯͨ ಋೖ࣌ʹ"OHVMBSͷॲཧεϚϗͰ ॏ͍ͱ͍͏ӟ͕͋ͬͨ ϑΝΠϧαΠζ͕େ͖͍ ଟػೳͰࠓճͷཁ݅ʹΦʔόʔεϖοΫ フレームワークの選定
Knockout ϑϩϯτΤϯυ+BWB4DSJQUϑϨʔϜϫʔΫ .77.ϞσϧΛ࠾༻ͯ͠ํόΠϯυΛ ࣮ݱ͢Δ .PEFM 7JFX 7JFX.PEFM Α͘"OHVMBS+4#BDLCPOFKTͱൺֱ͞Ε Δ͕ਓؾ͍ҹ
MVVM .PEFM +4ͷσʔλߏ 7JFX )5.- 7JFX.PEFM 7JFXͱ.PEFMΛ૬ޓʹόΠϯυͯ͠ͷ มߋૢ࡞Λࢹɾө͢Δ
MVVM View View Model Model )5.- +BWB4DSJQU 0CKFDUT ૢ࡞ Λߋ৽
ॲཧ )5.-Λ ߋ৽
Knockout ಛ "OHVMBS #BDLCPOFʹൺͯଞͷϥΠϒ ϥϦͷґଘ͕ແܰ͘ྔ ϧʔςΟϯάWBMJEBUFͳͲͷػೳແ͍ ͋Δఔຊޠʹ༁͞ΕͨυΩϡϝϯτ ͋Δ ެࣜαΠτ͚ͩͰେମͷ͍ํ͕ѲͰ ͖Δ
Knockoutの採用理由 ํόΠϯυ͕ศར ෆཁͳػೳ͕গͳ͍ ϖʔδʹͷΈಋೖ͢ΔͷͰɺϧʔςΟϯ άػೳෆཁͳͲ ֶशίετ͕ൺֱత͍
Knockoutの採用理由 ϑΝΠϧαΠζ͕খ͍͞ αΠτͷߏ্ɺK2VFSZ͕ඞਢͩͬͨͷ ͰϑϨʔϜϫʔΫ͍ܰͷ͕ྑ͔ͬͨ
Knockout ,OPDLPVUͷαϯϓϧ ಈ͘ͷ͕ϒϩάʹ্͕͍ͬͯ·͢ IUUQUFDIBBJODDPKQBSDIJWFT ͕ɺόά͕͋Γ·ͨ͠PS[
var ViewModel = function() { this.taroPoint = ko.observable(60); this.jiroPoint =
ko.observable(50); this.hanakoPoint = ko.observable(40); var data = [ {name: 'ଠ', value: this.taroPoint}, {name: 'ೋ', value: this.jiroPoint}, {name: 'Ֆࢠ', value: this.hanakoPoint} ]; var self = this; this.sortList = ko.computed(function() { return arraySortByValue(data); }, self, {name: true}); };
<table> <thead> <tr> <th>໊લ</th> <th>ಘ</th> </tr> </thead> <tbody data-bind="foreach: sortList">
<tr> <td data-bind="text: name"></td> <td data-bind="text: value"></td> </tr> </tbody> </table>
Knockout ಋೖϝϦοτ ํόΠϯυͰշద هड़͕؆୯Ͱཧղͯ͠Β͍͍͢ αϙʔτϒϥβ͕͍ *&͔Βαϙʔτ͍ͯ͠Δͦ͏Ͱ͢
Knockout ಋೖσϝϦοτ ଟগֶशίετ͕͔͔Δ 0CTFSWFSͷΈΛ͔ͭΉ·Ͱ͕࣌ؒ ͔͔ͬͨ )5.-ʹEBUBCJOE͕ҲΕΔ K2VFSZͷJE DMBTTΑΓϚγͰ͢Ͷ
Knockout ࢀߟϦϯΫ ,OPDLPVUKTDPOUFYUEFCVHHFS $ISPNFͷ&YUFOTJPO ͘͢͝ศརͦ͏ʂ ,OPDLPVUΦϑΟγϟϧ IUUQLOPDLPVUKTDPN ,OPDLPVUຊޠυΩϡϝϯτ IUUQLPKTTVLPCVUPDPN
,OPDLPVUKTDPOUFYUEFCVHHFS
TypeScript + Knockout ͜ͷϒϩάͷαϯϓϧιʔεΛ5ZQF4DSJQU Ͱॻ͍ͯΈͨ
interface dataType { name: string; value: KnockoutObservable<number>;} class ViewModel {
taroPoint: KnockoutObservable<string>; jiroPoint: KnockoutObservable<string>; hanakoPoint: KnockoutObservable<string>; sortList: KnockoutComputed<dataType>; constructor() { this.taroPoint = ko.observable(“60“); this.jiroPoint = ko.observable(“50“); this.hanakoPoint = ko.observable(“40“); var data: Array<dataType> = [/*লུ*/]; var self = this; this.sortList = ko.computed((): dataType => { return self.arraySortByValue(data); }, self, {deferEvaluation: true}); } }
TypeScript + Knockout ,OPDLPVU0CTFSWBCMF5 ,OPDLPVU$PNQVUFE5Ͱࢹ͢Δ ͷܕ͕ೖΓ·͢ ͦͷลΓ͕ཧղͰ͖Ε݁ߏॻ͖͍͢ͷ Ͱͳ͍͔ͳʁͱࢥ͍·͢
grunt 5ZQF4DSJQUͷϑΝΠϧΛDMBTT͝ͱʹ͚ͨ ͍ɻ +BWB4DSJQUͷϑΝΠϧ͕ෳͰ͖Δ API ViewModel Util
grunt ϑΝΠϧͷ࿈݁ ࿈݁ͨ͠ϑΝΠϧͷNJOJGZ
grunt UTDI
grunt HSVOUͰ࿈݁͢Δඞཁ͕ແ͔ͬͨʋ ʔʆ ϊ
grunt Ϗϧυ*%&ʹͤͬͺͳ͠Ͱ͕ͨ͠ HSVOUUZQFTDSJQUͳͲΛ͏ͱϏϧυΦϓγϣϯ ͕ڞ༗Ͱ͖ͨΓͱศརͦ͏Ͱ͢Ͷ IUUQTXXXOQNKTPSHQBDLBHFHSVOUUZQFTDSJQU
altJS ૉͷ+BWB4DSJQUΛॻࣗ͘৴͕ແ͍ਓBMU+4 ʹཔΔͱྑ͍ 5ZQF4DSJQU៉ྷͳ+BWB4DSJQUΛੜͯ͠ ͘Ε·͢ɻDMBTTϕʔεͷॻ͖ํ͕͔Δਓ ͳΒ+BWB4DSJQUͷॻ͖ํΛֶͼ͍ͨऔֻͬ ͔ΓʹΦεεϝ
フレームワーク +4͔ͳΓࣗ༝ͳهड़͕ՄೳͰϧʔϧΛઃ ͚ͳ͍ͱഁ͍͢͠ ͋ΔఔͷنʹͳΔ߹ϑϨʔϜϫʔ ΫͷಋೖΛݕ౼ͨ͠ํ͕ྑ͍ "OHVMBS+4#BDLCPOF 7VFKTͳͲͳͲ ϓϩδΣΫτʹ߹ͬͨͷΛ͍·͠ΐ͏