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
210
社内勉強会資料 PHPプロジェクトでのJavaScript
shmurakami
0
720
社内勉強会資料 JavaScriptの基本 その1
shmurakami
5
1.9k
Other Decks in Programming
See All in Programming
メールのエイリアス機能を履き違えない
isshinfunada
0
210
全PRの83%がAIレビューだけでマージできるようになった開発組織はその後どうなったか
athug
1
1.3k
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
210
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
360
ソフトウェア設計に溶けるインフラ ― AWS CDK のインフラ認識論
konokenj
3
740
ITヒヤリハットを整理してみた ~ライフサイクルと原因から考える再発防止策~
koukimiura
1
130
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
400
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
560
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.1k
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
9
6.1k
Android CLI
fornewid
0
210
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
180
Featured
See All Featured
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
290
A Tale of Four Properties
chriscoyier
163
24k
Between Models and Reality
mayunak
4
380
Evolving SEO for Evolving Search Engines
ryanjones
0
250
Test your architecture with Archunit
thirion
1
2.3k
Abbi's Birthday
coloredviolet
3
9k
ラッコキーワード サービス紹介資料
rakko
1
4.2M
Code Review Best Practice
trishagee
74
20k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
360
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
340
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
420
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ͳͲͳͲ ϓϩδΣΫτʹ߹ͬͨͷΛ͍·͠ΐ͏