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
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.2k
decoded_php.pdf
shmurakami
3
820
良心的にまじめに開発するための心構え
shmurakami
0
200
社内勉強会資料 PHPプロジェクトでのJavaScript
shmurakami
0
720
社内勉強会資料 JavaScriptの基本 その1
shmurakami
5
1.9k
Other Decks in Programming
See All in Programming
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
270
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
160
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.7k
ローカルLLMでどこまでコードが書けるか -縮小版 / How much code can be written on a local LLM Shortened
kishida
2
180
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
140
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
270
スマートグラスで並列バイブコーディング
hyshu
0
280
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
300
Vue × Nuxt × Oxc どこまで使える?実運用の現在地
andpad
0
360
Language Server 使ってる? 〜VSCode と Zed の場合〜 / Are you using a Language Server? ~For VS Code and Zed~
handlename
0
830
霧の中の代数的エフェクト
funnyycat
1
280
関数型プログラミングのメリットって何だろう?
wanko_it
0
140
Featured
See All Featured
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
New Earth Scene 8
popppiees
3
2.4k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
40k
GraphQLとの向き合い方2022年版
quramy
50
15k
Documentation Writing (for coders)
carmenintech
77
5.4k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
400
How to make the Groovebox
asonas
2
2.3k
RailsConf 2023
tenderlove
30
1.5k
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
460
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
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ͳͲͳͲ ϓϩδΣΫτʹ߹ͬͨͷΛ͍·͠ΐ͏