Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
TypeScriptで書くAngularJS @ GDG神戸2014.8.23
Search
OKUNOKENTARO
August 23, 2014
Programming
400
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TypeScriptで書くAngularJS @ GDG神戸2014.8.23
2014年8月23日発表分の資料をSlideShareより再掲。
http://www.slideshare.net/armorik83/gdgkobe-angularjs-2
OKUNOKENTARO
August 23, 2014
More Decks by OKUNOKENTARO
See All by OKUNOKENTARO
トレタO/X アーキテクチャ移行記 Next.js App Router化への道のり / TORETA TECH UPDATE 1
okunokentaro
5
12k
Podcastを継続する技術 / refactoradio-240119
okunokentaro
1
220
Webアプリケーション設計の第一歩は ディレクトリの整理から / Encraft 1
okunokentaro
33
10k
JSONとJSON Schemaを改めて理解する / tokyo_study
okunokentaro
9
2.5k
それでもどうしてRecoilを使うのか / Harajuku.ts Meetup Recoil
okunokentaro
19
5.7k
TypeScriptは10年でこんなに進化しました / TechFeed Experts Night 11
okunokentaro
6
1.8k
Hasura.io RDBをサクサク作る方法はARやO/RMだけじゃなくなりました/hasura-io
okunokentaro
5
730
コードには型アノテーションよりも要件アノテーションを増やせ!/harajukuts2
okunokentaro
14
6.6k
10年と3ヶ月でWebサービスを作った話 / Piyogrammer Conference 2021
okunokentaro
2
1.1k
Other Decks in Programming
See All in Programming
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
610
WebAssembly in Android Apps 〜 WASMはJNIの夢を見るか
keiji
1
110
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
4
700
新卒PdEのリアル
ryu1013
1
500
すこし踏み込む CancellationToken
htkym
2
560
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
340
Are APIs Still Relevant in the AI Era?
soyuka
0
270
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2k
WebMCP Challenge に星空観察アプリで参加した話
okajun35
0
180
Heart of Swift Concurrency
koher
0
910
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
220
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
260
Featured
See All Featured
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
240
Joys of Absence: A Defence of Solitary Play
codingconduct
1
520
Unsuck your backbone
ammeep
672
58k
Everyday Curiosity
cassininazir
0
320
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
360
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
So, you think you're a good person
axbom
PRO
2
2.2k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
300
GraphQLとの向き合い方2022年版
quramy
50
15k
BBQ
matthewcrist
89
10k
Automating Front-end Workflow
addyosmani
1369
210k
Transcript
5ZQF4DSJQUד剅ֻ "OHVMBS+4 "OHVMBS+4⹈䓼⠓CZ(%(牞䨫
"OHVMBS+4ךְְהֿ ˖ غ؎ٝسָ知⽃ 涪⚥חٌثك٦ءّٝ♳ָ ˖ 3&45GVM"1*䲿ךؿٖ٦يٙ٦ؙ ˖ ط؎ذ؍ـ،فٔה麩ְ ⦐➂ⵃ欽ךءأذي؟ؙה⡲ !BSNPSJL
植㖈ך圓䧭 /PEFKT &YQSFTT .POHP%# "OHVMBS+4 Database RESTful API Controller HTML
#SPXTFS JSON
ְײ.&"/أةحؙ ˖ ..POHP%# ˖ &&YQSFTT ˖ ""OHVMBS+4 ˖ //PEFKT Ⰻ鿇+BWB4DSJQU
Ⰻ鿇+BWB4DSJQU ׳הخٓ؎
http://www.typescriptlang.org/
،ٝ؛٦ز 兛媮5ZQF4DSJQU 剅ְגהְֲ倯
תך倯 כׄת׃׳ֲ
5ZQF4DSJQUהכ ˖ BMU+4הְ鎉铂ךמהא ˖ .JDSPTPGU爡ָ䎃ַ涪 חWָ⳿ ˖ +BWB4DSJQUך♳⡘✼䳔鎉铂 㢌䳔䖓ך+4ا٦أ铣װְׅ ˖
涸㘗➰ֽ ˖ $ח䢪גְⰅװְׅ
ז5ZQF4DSJQU ˖ 傀㶷ך+BWB4DSJQU项欵ծⰋג⢪ִ ˖ 㢌䳔䖓ך+4ا٦أָ铣װְׅ ˖ 涸㘗➰ֽBMU+4ד䝢זծָֿ♧殢ךⵃ挿 ˖ "OHVMBS+4⹛ַׅהـٓؐؠ♳ךرغحؚ ָ㢳涪̔㢌䳔䖓ךا٦أ铣堣⠓ָ㢳ְ
˖ 葿ղ⡲㨣הծ"OHVMBS+4ֽד 㣐鋉垷חזָ ˖ /PEFKT .POHP%#⢘欽ׅה +40/װ0CKFDUך䪔ְָ걼涪 ˖ 涸㘗➰ָֽ⸬ֻ ז5ZQF4DSJQU
˖ ؙٓأك٦أזؔـآؙؑز䭷ぢ鎉铂 ˖ Class.prototype.method = function(){… ⦜זQSPUPUZQF剅ֻ䗳銲כ֮תׇ ˖ ٗآحؙכⱄⵃ欽ךؙٓأחתה ˖
5ZQPכ؝ٝػ؎ָٓⰋ⸂ד䭷䶯 ˖ ؝ٝػ؎ٕؒٓ٦ָ⳿וֶַַֿ׃ְ ז5ZQF4DSJQU
5ZQF4DSJQU⢪ֲה 䠬⹛ׅ״
5ZQF4DSJQU ؟ٝفٕ 5ZQF4DSJQUⰕ䒭״䒷欽
class Greeter { private greeting: string; constructor(message: string) { this.greeting
= message; } public greet() { return 'Hello, ' + this.greeting; } } ! var greeter = new Greeter('world'); ! var button = document.createElement('button'); button.textContent = 'Say Hello'; button.onclick = () => { alert(greeter.greet()); }; ! document.body.appendChild(button); TS
var Greeter = (function () { function Greeter(message) { this.greeting
= message; } Greeter.prototype.greet = function () { return 'Hello, ' + this.greeting; }; return Greeter; })(); ! var greeter = new Greeter('world'); ! var button = document.createElement('button'); button.textContent = 'Say Hello'; button.onclick = function () { alert(greeter.greet()); }; document.body.appendChild(button); //# sourceMappingURL=greeter.js.map JS
class Greeter { private greeting: string; constructor(message: string) { this.greeting
= message; } public greet() { return 'Hello, ' + this.greeting; } } ! var greeter = new Greeter('world'); ! var button = document.createElement('button'); button.textContent = 'Say Hello'; button.onclick = () => { alert(greeter.greet()); }; ! document.body.appendChild(button); TS
class Greeter { private greeting: string; constructor(message: string) { this.greeting
= message; } public greet() { return 'Hello, ' + this.greeting; } } ! var greeter = new Greeter('world'); ! var button = document.createElement('button'); button.textContent = 'Say Hello'; button.onclick = () => { alert(greeter.greet()); }; ! document.body.appendChild(button); ̒䒷侧ך㘗 ،ؙإأ⥜귅㶨̓ OFX דㄎל̓ ֿך鴟כ֮ת㢌זְ ̓،ٗ٦ꟼ侧䒭&4⯓《 TS
ך➭ך暴䗙 ˖ 㘗䱿锷֮תׅ ˖ var foo = 'abc'; var foo:
string = 'abc';ה剅ַזֻגְְ ˖ JOUFSGBDFד㹋鄲ךזְ㘗ךך㹀纏 ˖ NPEVMFדせ瑞涸ז⢪ְ倯 ֿֿדְֲNPEVMFכ$PNNPO+4הכ殯ז ˖ آؑطؙٔأծ竰䪫ծזוזו
˖ ַתׁמ孑 ջ5ZQF4DSJQUٔؿ؋ٖٝأ խ7FS㼎䘔ռ ˖ 俑岀ֽדזֻծ涪橆㞮ך圓眠ַ 佄䴂خ٦ٕHSVOU CPXFS UTEזוך 鍑铡䲓鯹
˖ +BWB4DSJQU㛇燉濼陎鯹גתׅ ֶׅׅ剅硂 !WWBLBNF
ַֿֿכ ך鑧
5ZQF4DSJQU⢪ֲًٔحز ˖ "OHVMBS+4כ0CKFDUךװהָ㢳ְ ˖ 㘗➰ֽֿׅהדծ♶僇זفٗػذ؍פך ،ؙإأծ5ZQPծוו䭷䶯ׁ ˖ 䒷侧ח㘗䭷㹀׃גֶֽלծ铎㘗 ♷ִג؝ٝػ؎ٕؒٓ٦涪欰 ˖
孡➰ֻךָ傍ְ䝢תזְ
׃ ˖ ההؙإך֮"OHVMBS+4ך鎸岀זך דծ5ZQF4DSJQU㼪Ⰵחכ䊨㣗ָ䗳銲 ˖ ךֶ鑧׃תׅ
$POUSPMMFSךⴱ劍⻉
<body ng-app> <div ng-controller="SampleCtrl"> <strong>First name:</strong> {{firstName}}<br> </div> </body> HTML
JS function SampleCtrl ($scope) { $scope.firstName = 'John'; $scope.lastName = 'Doe'; ! $scope.getFullName = function () { return $scope.firstName + ' ' + $scope.lastName; }; };
<body ng-app> <div ng-controller="sampleCtrl"> <strong>First name:</strong> {{firstName}}<br> </div> </body> HTML
JS ! 5ZQF4DSJQUכ♶銲הְֲ倯 ֿך剅ֹ倯כװת׃׳ֲ ֮ה֮הخְٓדׅ ̕ function SampleCtrl ($scope) { $scope.firstName = 'John'; $scope.lastName = 'Doe'; ! $scope.getFullName = function () { return $scope.firstName + ' ' + $scope.lastName; }; };
angular.module('MyAngularJs', [/*...*/]); // Setter ! function SampleCtrl ($scope) { $scope.firstName
= 'John'; $scope.lastName = 'Doe'; ! $scope.getFullName = function () { return $scope.firstName + ' ' + $scope.lastName; }; }; ! angular.module('MyAngularJs') // Getter .controller('SampleCtrl', [ '$scope', // 使用するServiceは全て文字列で表記 SampleCtrl ]); JS BOHVMBSNPEVMF ⢪ְת׃׳ֲ
angular.module('MyAngularJs', [/*...*/]); // Setter ! function SampleCtrl ($scope) { $scope.firstName
= 'John'; $scope.lastName = 'Doe'; ! $scope.getFullName = function () { return $scope.firstName + ' ' + $scope.lastName; }; }; ! angular.module('MyAngularJs') // Getter .controller('SampleCtrl', [ '$scope', // 使用するServiceは全て文字列で表記 SampleCtrl ]); JS ֿֿ̓5ZQF4DSJQUח׃תׅ
TS // ... class SampleCtrl { constructor ( public $scope
) { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', ['$scope', SampleCtrl]);
// ... class SampleCtrl { constructor ( public $scope )
{ this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', ['$scope', SampleCtrl]); TS ̒׳ה孡䭯䝤ְַ׃זְ խֽוծ"OHVMBS+4ך䒷侧כ㟓ִָ խזךד何遤׃גֶֻ ̓،ٗ٦ꟼ侧זךדUIJTָ䭷ׅⰻ㺁כ խ㢌זְ@UIJTהַ׃זֻגְְ ̕DMBTT㹑鎉׃תׅ DMBTTך؝ٝأزؙٓةָ床̓
class SampleCtrl { constructor ( public $scope ) { //
... } } ! class SampleCtrl { public $scope; constructor ($scope) { this.$scope = $scope; // ... } } TS ずֿׄה ׃גתׅ ♳ךקֲָءٝفٕ
؝ٝػ؎ٕ ˖ ➙剅ְ5ZQF4DSJQU؝ٝػ؎ٕׅה ˖ ؒٓ٦ /sample.ts(1,1): Cannot find name 'angular'.
˖ BOHVMBSהְֲ㢌侧כ搀ְה鎉תׅ
ֿד㘗㹀纏ؿ؋؎ٕ ˖ ➭ך+4ا٦أ荈ח׃ծٓ؎ـٓٔח׃ 欽ְהծ؝ٝػ؎ٓכծוך㢌侧ָ㹑鎉 幥ַⴻ倖דֹתׇ ˖ 㘗㹀纏ؿ؋؎ٕה撑⢪ְծ؝ٝػ؎ٓ ח侄ִתׅ
%FOJUFMZ5ZQFE ˖ %FOJUFMZ5ZQFEהְֲ؝ىُصذ؍דכծ +4ٓ؎ـٓٔך剣せוֿח㼎䘔׃ 㘗㹀纏ؿ؋؎ٕ鞢㺡ח⥂㸚׃גְ http://definitelytyped.org/ ˖ K2VFSZ %KT 6OEFSTDPSFKT
+BTNJOF .POHP%#זוזו˘ ˖ "OHVMBS+4֮
TS /// <reference path="angularjs/angular.d.ts" /> ! class SampleCtrl { constructor
( public $scope ) { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', ['$scope', SampleCtrl]); ̓撑㹑鎉ׅה ̕؝ٝػ؎ָٓ㢌侧BOHVMBS钠陎㘗➰ֹד
TS declare var angular: any; ! class SampleCtrl { constructor
( public $scope ) { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', ['$scope', SampleCtrl]); ̓EFDMBSFהְֲչ،ٝؽؒٝز㹑鎉պ欽ְה խ㘗㹀纏ؿ؋؎ָٕ搀ֻג؝ٝػ؎ٓח侄ִ խ؝ٝػ؎ٕ穠卓חכ䕦갟׃זְ
TS declare var angular: any; ! class SampleCtrl { constructor
( public $scope ) { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', ['$scope', SampleCtrl]);
BOZ㘗 ˖ 5ZQF4DSJQUחכOVNCFS TUSJOH CPPMFBOה ְֲفٔىذ؍ـ㘗ָ欽䠐ׁגְ ˖ ך➭ծWPJE OVMM VOEFOFE㘗欽䠐ׁגְ
ֿך㘗דך㢌侧㹑鎉כדֹזְ ˖ BOZ㘗כ䖞勻ך+BWB4DSJQUך㘗 ˖ ؝ٝػ؎ٕؒٓ٦װ䖤׆럀ׇ㜥さװ 㹀纏ؿ؋؎ٕ锃麦דֹזְ㜥さזוח
ًاحسך ⴓⶴ
TS // ... ! class SampleCtrl { constructor ( public
$scope ) { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! // ...
TS // ... ! class SampleCtrl { constructor ( public
$scope ) { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; ! this.$scope.getFullName = () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } } ! // ... ! ͕͜͜૿͑ͦ͏ͳͷ ʹݟ͍͑ͯΔʜ
TS constructor ( public $scope ) { this.init(); ! this.$scope.getFullName
= () => { return this.$scope.firstName + ' ' + this.$scope.lastName; }; } ! private init() { this.$scope.firstName = 'John'; this.$scope.lastName = 'Doe'; }
TS constructor ( public $scope ) { this.init(); } !
private init() { // ... } ! public getFullName(): string { return this.$scope.firstName + ' ' + this.$scope.lastName; } ̕䨱⦼ך㘗
?!
غ؎ٝس怩ח岣䠐 ˖ TDPQFח秡➰ֽגְזְًاحسכ ⹛⡲׃תׇ this.$scope.getFullName = () => { return
// ... }; 何㢌כׯהغ؎ٝسׁגְ
TS constructor ( public $scope ) { this.init(); this.$scope.getFullName =
this.getFullName.bind(this); } ! private init() { // ... } ! public getFullName(): string { return this.$scope.firstName + ' ' + this.$scope.lastName; } 姻׃ֻכCJOE ⢪ְתׅ
ד CJOE׃זֻגְְ 倯岀ָ֮
剑鵚崧遤אא֮ $POUSPMMFSBT邌鎸
<body ng-app> <div ng-controller="SampleCtrl"> <strong>First name:</strong> {{firstName}}<br> <strong>Last name:</strong> {{lastName}}<br>
<strong>Full name:</strong> {{getFullName()}}<br> </div> </body> HTML
<body ng-app> <div ng-controller="SampleCtrl as c"> <strong>First name:</strong> {{c.firstName}}<br> <strong>Last
name:</strong> {{c.lastName}}<br> <strong>Full name:</strong> {{c.getFullName()}}<br> </div> </body> HTML
<body ng-app> <div ng-controller="SampleCtrl as c"> <strong>First name:</strong> {{c.firstName}}<br> <strong>Last
name:</strong> {{c.lastName}}<br> <strong>Full name:</strong> {{c.getFullName()}}<br> </div> </body> HTML ̕呓秛ׅ㢌侧せ ̓㢌侧せفٗػذ؍ խ➰ֽזְהSPPU4DPQF䪔ְ
TS class SampleCtrl { public firstName: string; public lastName: string;
! constructor () { this.init(); } ! private init() { this.firstName = 'John'; this.lastName = 'Doe'; } ! public getFullName(): string { return this.firstName + ' ' + this.lastName; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', [SampleCtrl]);
TS class SampleCtrl { public firstName: string; public lastName: string;
! constructor () { this.init(); } ! private init() { this.firstName = 'John'; this.lastName = 'Doe'; } ! public getFullName(): string { return this.firstName + ' ' + this.lastName; } } ! angular.module('MyAngularJs') .controller('SampleCtrl', [SampleCtrl]); ̕TDPQF♶銲 ̒TDPQF♶銲 ̒UIJTך湫䱸ךفٗػذ؍ח խזךד㘗㹀纏
$POUSPMMFSBT邌鎸כ 5ZQF4DSJQUה湱䚍ְְָ
$POUSPMMFSBTךًٔحز ˖ $POUSPMMFSطأز׃㜥さחծ㢌侧せך ֶַ־ד僇然חז ˖ "OHVMBS+4ך䠐㔳׃זְفٗػذ؍㢌刿 ־ ˖ ׃גծ5ZQF4DSJQUךؙٓأה湱䚍ְְָ
$POUSPMMFSBTךرًٔحز ˖ QSJWBUFזًاحس)5.-♳ד䭷㹀ׅל ⢪ִג׃תֲ ˖ 5ZQF4DSJQU؝ٝػ؎ٓכ)5.-ח㼎׃גכ⫴ַזְ ˖ )5.-♳ד{{c.$scope.firstName}}הׅל غ؎ٝسדⵖꣲדָֹծ׳הⱔꞿ ˖
5ZQF4DSJQU⢪זְז㉏겗זְ
דCJOE 'BDUPSZװ%JSFDUJWFד⢪ִךד ⚕倯鋙ִגֶֻץ׃
5ZQF4DSJQUד ֹׅ剅ֽ
4FSWJDFךⴱ劍⻉
ךח ˖ 4FSWJDFה'BDUPSZך麩ְ 椚鍑ׁגְתַׅ
'BDUPSZ angular.module('MyAngularJs') .factory('MyProvider', ['otherProvider', function (otherProvider) { return new MyProvider(otherProvider);
}]); JS angular.module('MyAngularJs') .service('MyProvider', ['otherProvider', MyProvider]); 4FSWJDF JS
'BDUPSZ angular.module('MyAngularJs') .factory('MyProvider', ['otherProvider', function (otherProvider) { return new MyProvider(otherProvider);
}]); JS angular.module('MyAngularJs') .service('MyProvider', ['otherProvider', MyProvider]); 4FSWJDF JS ̓؎ٝأةٝأ欰䧭׃ג鵤ׅ ؝ٝأزؙٓة♷ִג"OHVMBS+4ָ欰䧭ׅ̓ 4JOHMFUPOדׅխ խ
'BDUPSZ angular.module('MyAngularJs') .factory('MyProvider', ['otherProvider', function (otherProvider) { return new MyProvider(otherProvider);
}]); JS angular.module('MyAngularJs') .service('MyProvider', ['otherProvider', MyProvider]); 4FSWJDF JS 5ZQF4DSJQUד 䪔ְװְׅךכ4FSWJDF
⢪ְⴓֽ ˖ 4JOHMFUPOַծꟼ侧תה0CKFDUַהְֲ麩ְ ˖ 朐䡾⥂㶷כ4FSWJDFח䬐ׇ׆SPPU4DPQFחׇׁץֹ ˖ 'BDUPSZכ0CKFDU鵤ׅךדծًٝغךⰕך嚊䙀ח 鵚ְךꥷכծBOHVMBSCJOE ׅ ˖
⢪ְװְׅ倯דְְה䙼ג 5ZQF4DSJQUד剅ֻז4FSWJDFַ
أ٦ػ٦ؙٓأכ ˖ ؙٓأك٦أ001הְִל竰䪫 ˖ أ٦ػ٦ؙٓأח꧊秈ׇׁג؟ـؙٓأ ⡲לְְךדכ ̔؝ٝأزؙٓةחⰋגך1SPWJEFS床ׅ"OHVMBS+4 խה竰䪫כ湱䚍ָ䝤ְךדծְְ鑐遤ꐪ铎⚥
խNJYJO鑐׃גְָ姻湫ؔأأًדֹזְ
4FSWJDF 5ZQF4DSJQUד剅ְ⢽
TS class MyResource { constructor( private $q: ng.IQService, private $resource:
ng.resource.IResourceService ) { // ... } ! private resource(): IResourceClass { var baseApi = '/api/entities'; var params: any = null; var actions = { getWithEntityId: { method: 'GET', url: baseApi+'/:id', isArray: true} }; return <IResourceClass>this.$resource(baseApi, params, actions); } ! public fetchEntity(id: my.obj.EntityId): IPromiseReturnEntity { var dfd = this.deferAcceptEntity(); ! var query = {id: id}; this.resource().getWithEntityId( query, this.success(), this.failure() ).$promise.then(this.fetchThen(dfd)); ! return dfd.promise; } private fetchThen(dfd: IDeferredAcceptEntity): (res: my.obj.IEntities) => void { return (res) => { var e: my.obj.IEntity = res[0]; dfd.resolve(e); }; } } ! angular.module('MyAngularJs') .service('MyResource', ['$q', '$resource', MyResource]);
class MyResource { constructor( private $q: ng.IQService, private $resource: ng.resource.IResourceService
) { // ... } ! private resource(): IResourceClass { var baseApi = '/api/entities'; var params: any = null; var actions = { getWithEntityId: { method: 'GET', url: baseApi+'/:id', isArray: true} }; return <IResourceClass>this.$resource(baseApi, params, actions); } ! public fetchEntity(id: my.obj.EntityId): IPromiseReturnEntity { var dfd = this.deferAcceptEntity(); ! var query = {id: id}; this.resource().getWithEntityId( TS ̕BOHVMBSEUTך㘗㹀纏ؿ؋؎ٕ崞欽 ٍ̓ؗأز׃זְה鋵ך㘗ה׃גؒٓ٦⳿ׅ ̕ⴽךؿ؋؎ٕד杝荈ח*3FTPVSDF$MBTT㹀纏 խBOHVMBSEUTFYUFOET竰䪫ׇׁגְ
isArray: true} }; return <IResourceClass>this.$resource(baseApi, params, actions); } ! public
fetchEntity(id: number): IPromiseReturnEntity { var dfd = this.deferAcceptEntity(); ! var query = {id: id}; this.resource().getWithEntityId( query, this.success(), this.failure() ).$promise.then(this.fetchThen(dfd)); ! return dfd.promise; } private fetchThen(dfd: IDeferredAcceptEntity): (res: my.obj.IEntities) => void { return (res) => { var e: my.obj.IEntity = res[0]; dfd.resolve(e); }; } } ! angular.module('MyAngularJs') .service('MyResource', ['$q', '$resource', MyResource]); TS ֿֿתדָⰋג䨱⦼ך㘗 ̕杝荈ך㘗 ̓杝荈ך㘗 ̕%*ׅ1SPWJEFSה荈魦ך؝ٝأزؙٓة խ䧭⸆儗ה㣟侁儗חㄎלꟼ侧 ̒➙㔐כꟼ⤘זְ
♧孡חװֺׅ
剑䖓ח 㘗㹀纏ؿ؋؎ٕך鑧
آؑطؙٔأ ˖ BOHVMBSEUTװBOHVMBSSFTPVSDFEUTחכ החַֻآؑطؙٔأָ⳿גֹתׅ ˖ 䫺䫑䠬ָ֮ה׳הꨇ׃ֻ鋅ִַ
BOHVMBSEUT余殛 $resource<T>(); ↓ ng.resource.IResourceClass<T>型のインスタンス .query(); ↓ ng.resource.IResourceArray<T>型のインスタンス .$promise ↓ ng.IPromise<ng.resource.IResourceArray<T>>型のインスタンス
BOHVMBSEUT余殛 ! ݏΜͳ͖ͬͯͨ $resource<T>(); ↓ ng.resource.IResourceClass<T>型のインスタンス .query(); ↓ ng.resource.IResourceArray<T>型のインスタンス .$promise
↓ ng.IPromise<ng.resource.IResourceArray<T>>型のインスタンス
BOHVMBSEUT ng.resource.IResourceClass<T>型のインスタンス .query(); ↓ ng.resource.IResourceArray<T>型のインスタンス .$promise ↓ ng.IPromise<ng.resource.IResourceArray<T>>型のインスタンス .then<TResult>( successCallback:
(promiseValue: T) => TResult, errorCallback?: (reason: any) => TResult, notifyCallback?: (state: any) => any ): IPromise<TResult>
BOHVMBSEUT ng.resource.IResourceClass<T>型のインスタンス .query(); ↓ ng.resource.IResourceArray<T>型のインスタンス .$promise ↓ ng.IPromise<ng.resource.IResourceArray<T>>型のインスタンス .then<TResult>( successCallback:
(promiseValue: T) => TResult, errorCallback?: (reason: any) => TResult, notifyCallback?: (state: any) => any ): IPromise<TResult> 殅䠐ׅץֹזךכծֿך鴟כ Ⰻ鿇דչמהאך㘗せպד֮הְֲֿה չ5䒷侧חה53FTVMU鵤ׅꟼ侧պ䒷侧הׅ
דծ穠㽷5חכ ⡦Ⰵִִי
BOHVMBSEUT余殛 ng.IPromise<ng.resource.IResourceArray<T>> ה5ָطأز׃גְךדծ(promiseValue: T)ך5כ "ng.resource.IResourceArray<T>"Ⰻ⡤䭷ׅկ ! "ng.resource.IResourceArray<T>"ך⚥ך5כ ♧殢剑ⴱծ$resource<T>()ה剅ְ儗ך5կIResourceArray<T>כ"1* ַ鷏גֻ穠卓ךꂁךֿהկ !
אתծךꂁך⦐ղך㘗$resource<T>()ך5ח䭷㹀׃גֶֽ ל.then()ך⚥ד㘗➰ֽׁ朐䡾ד⢪ִ
*OUFSGBDF⢪ֲ ˖ آؑطؙٔأ걼籕ח䪔ֲהծ㘗荈⡤ָ 䒷侧אךדⱄⵃ欽ךד㉏겗דׅ ˖ JOUFSGBDF㢳欽׃ծ؝٦سⰻח5ָ⳿ג ֿזְ״ֲٓحف׃תׅ ˖ *1SPNJTF3FUVSO&OUJUZ *%FGFSSFE"DDFQU&OUJUZזוכ
ְֲ鑐遤ꐪ铎ך劣ծ欰תת׃
椚鍑ָ帾ת ˖ ⯓➂ח״㘗㹀纏ؿ؋؎ٕכ״ֻדֹ גְ ˖ 㘗㹀纏铣הծ%PDVNFOU铣ח 瘝׃ְ椚鍑ָ䖤 ˖ +BWB4DSJQUֽ剅ְגְծֿֿתד 䠐陎׃זְכ׆
㘗ח걾ֲ 5ZQF4DSJQU剅ֲֿ
׀幠耮ָ֮הֲ׀ְׂת׃