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
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
150
1年で人数1.5倍、PR数5.5倍増。 品質とアウトカムはどうなったか、 何が効いたか
ike002jp
0
140
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
140
Hatena Engineer Seminar #37「言語モデルの活用に関する研究」
slashnephy
0
520
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
230
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
170
SLOをサービス品質の共通言語にするために 取り組んできたこと
wakana0222
0
510
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
210
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
190
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
9.1k
初めてのKubernetes 本番運用でハマった話
oku053
0
130
Featured
See All Featured
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.1k
Side Projects
sachag
455
43k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Amusing Abliteration
ianozsvald
1
230
The Spectacular Lies of Maps
axbom
PRO
1
860
Rails Girls Zürich Keynote
gr2m
96
14k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
64
56k
4 Signs Your Business is Dying
shpigford
187
22k
Navigating Weather and Climate Data
rabernat
0
370
We Are The Robots
honzajavorek
0
280
Making Projects Easy
brettharned
120
6.7k
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ͳͲͳͲ ϓϩδΣΫτʹ߹ͬͨͷΛ͍·͠ΐ͏