SlideShare a Scribd company logo
FEEDBACK
ANGULARJS + TYPESCRIPT AT SERENYTICS
TypeScript meetup #2 - Paris
2015-06-10
Adrien Chauve
CTO
@adrienchauve
@Serenytics
DISCLAIMER
I'm not a TypeScript expert, nor an AngularJS expert!
But it's better if you know some to follow this talk ;-)
CONTENTS
1.
2.
3.
4.
What we do: Dashboards and Widgets
Why moving to TypeScript?
Angular + TypeScript: HowTo?
The Good, the Bad and the Ugly
1. WHAT WE DO: DASHBOARDS AND WIDGETS
1. WHAT WE DO: DASHBOARDS AND WIDGETS
Year -- All -- Product -- All -- Country -- All --
 13
 $1,034
 $339
1. WHAT WE DO: DASHBOARDS AND WIDGETS
Initial question:
we use AngularJS with lots of different widgets
how to reuse as much code as possible?
while still being able to tune each widget appearance
Solutions:
Service: not enough (factorize logic but not UI interactions)
Single generic directive: single template problem
Directive composition: a generic base directive plus several
small directives to adapt the template and behavior
TypeScript to the rescue, and much much more!
2. WHY MOVING TO TYPESCRIPT?
2. WHY MOVING TO TYPESCRIPT? (1/2)
Potential good solution to factorize our code (more on that
later)
All the goodness of ES6 (classes, fat arrow, template
strings, soon async/await, ...), plus:
statically typed
automatic feedback while developing (think gulp/grunt
watch)
interfaces! description of complex types (e.g. widget
data model) available in a single place and not spread
around the code (Angular is really persmissive for
models)
2. WHY MOVING TO TYPESCRIPT? (2/2)
It's just a Javascript superset, so the migration can be
incremental and smooth, no need to rewrite the app from
scratch
really easy integration with Angular (even if a little scary at
first)
forces to use classes, and then better organize the code
(again Angular is really permissive)
Angular2 is written in TypeScript: Google + Microsoft are
now supporting it
3. ANGULAR + TYPESCRIPT: HOWTO?
3. ANGULAR + TYPESCRIPT: THE BASICS
Controller
Service
Directive
3. ANGULAR + TYPESCRIPT: THE BASICS - CONTROLLERS
Using ControllerAs syntax, a controller is just a Class
angular
.module('my-lib')
.controller('LoginController', LoginController);
$stateProvider
.state('login', {
url: '/login',
templateUrl: 'mylib/auth/login.template.html',
controller: 'LoginController',
controllerAs: 'vm'
})
3. ANGULAR + TYPESCRIPT: THE BASICS - CONTROLLERS
Example in ES5:
var LoginController = (function () {
function LoginController(loginService, $state) {
this.loginService = loginService;
this.$state = $state;
this.invalidCredentials = false;
if (loginService.isLogged) {
$state.transitionTo('home');
}
}
LoginController.prototype.login = function () {
var _this = this;
this.invalidCredentials = false;
this.loginService.loginWithCrendentials(this.email, this.password)
.catch(function () {
_this.invalidCredentials = true;
});
};
return LoginController;
})();
3. ANGULAR + TYPESCRIPT: THE BASICS - CONTROLLERS
Example in TypeScript: lots of goodness in it
class LoginController {
invalidCredentials = false;
email: string;
password: string;
constructor(private loginService: ILoginService,
private $state: angular.ui.IStateService) {
if (loginMgr2.isLogged) {
$state.transitionTo('home');
}
}
login () {
this.invalidCredentials = false;
this.loginService.loginWithCrendentials(this.email, this.password)
.catch(() => {
this.invalidCredentials = true;
});
}
}
3. ANGULAR + TYPESCRIPT: THE BASICS - SERVICES
Just like Controllers:
class LoginService {
constructor(private Restangular: restangular.IService) {
}
loginWithCrendentials (email: string, password: string) {
return this.Restangular.one('api/token')
.then((apiData) => {
// ... save token
// ... transition to 'home' state
});
}
}
angular
.module('my-lib')
.service(loginService, LoginService);
3. ANGULAR + TYPESCRIPT: THE BASICS - DIRECTIVES
interface IWidgetDirectiveScope extends ng.IScope {
widgetModel: IWidgetModel;
}
class WidgetDirective {
scope = {
widgetModel: '=',
};
restrict = 'E';
replace = true;
controllerAs = 'vm'
templateUrl = 'components/widgets/widget.directive.html';
controller = WidgetController;
link = (scope: IWidgetDirectiveScope,
element: ng.IAugmentedJQuery,
attrs: ng.IAttributes,
controller: WidgetController) => {
// ...
}
}
angular.module('my-lib').directive('my-widget', () => {
return new WidgetDirective();
});
3. ANGULAR + TYPESCRIPT: EVEN MORE!
ok Angular + TypeScript is cool, but what about code reuse
and our initial question?
Lots of common behavior between
table widget / value widget (= single cell table)
all chart widgets (pie chart, bar chart, curve chart, ...)
3. ANGULAR + TYPESCRIPT: REUSE CODE!
Different ways:
keep the same controller, adapt the template, 2 directives
for the same price!
inherit base controller to inherit basic behavior exposed to
the view (think Mixins when available)
refresh state (reload data from API)
error handling
global data filtering
data export
implement models (e.g. Widgets) as classes completely
outside of Angular's world
3. ANGULAR + TYPESCRIPT: OUR SOLUTION FOR CODE REUSE
keep directives small and simple, and have several if
needed
each customized with its own template
with possibly one base directive to factorize $scope
features and simple properties (replace, ControllerAs, ...)
one base controller and several inherited controllers as
needed
pure TypeScript Widget classes without any Angular
dependency (model/business logic)
4. THE GOOD, THE BAD AND THE UGLY
4. ANGULAR + TYPESCRIPT: THE GOOD PARTS
easy integration with Angular, especially with ControllerAs
since 1.2
even encourage to use best practises for Angular 2
(ControllerAs => Components)
incremental migration (superset + gradual typing with any)
type infos, type inference and all the good that comes with
it
Interfaces: all the model in one place!
Good debugging experience using source maps with
Chrome
4. ANGULAR + TYPESCRIPT: THE BAD PARTS (1/2)
using 3rd party libraries (missing or outdated typed
definitions): but not such a great problem
dev environment a little more complex (gulp, tsc, tslint,
tsd): actually not so much pain
a little more work sometimes (adding types, directives
more verbose)
4. ANGULAR + TYPESCRIPT: THE BAD PARTS (2/2)
Dealing with class hierarchies: compromise between testability and verbosity
class BaseWidgetController {
private _data: IData;
constructor(private globalFilterService: GlobalFilterService /* other depende
filterData () { return this.globalFilterService.applyFilters(this._data); }
}
class TableWidgetController extends BaseWidgetController {
constructor(private globalFilterService: GlobalFilterService /* other depende
super(globalFilterService, ....);
}
}
/* less verbose alternative - dangerous */
class GlobalFilterService {
/* WARNING: bypass Angular DI and make testing more complex */
static instance() {
angular.element(document.body).injector().get('globalFilterService'
}
applyFilters(...) {...}
}
class BaseWidgetController {
private _data: IData;
constructor() {}
filterData () { return GlobalFilterService.instance().applyFilters(this
}
4. ANGULAR + TYPESCRIPT: UGLY PARTS?
Not really... or maybe
when coding e2e tests with Protractor + TypeScript:
incompatible Promises types
// selenimum-webdriver type declaration
interface IThenable<T> {
then<R>(opt_callback?: (value: T) => Promise<R>, opt_errback?: (error:
then<R>(opt_callback?: (value: T) => R, opt_errback?: (error: any) => any): P
}
// vs. ES6 type declaration
interface Thenable<R> {
then<U>(onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error:
then<U>(onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error:
}
Good luck if you use nodejs with
Q.denodeify or Bluebird.promisify
TOWARDS ANGULAR 2.0: ANGULAR IN TYPESCRIPT
If you:
have a growing project in Angular 1.X
want to invest on it for the next couple of years
Do you a favor, go for TypeScript!
Congrats! you'll be half way through the migration to
Angular2!
Angular 2: everything becomes a TypeScript class with
annotations (Component, Directive)
REFERENCES
Course
@ Pluralsight
by @Foxandxss
by @john_papa
Using TypeScript for Large AngularJS Applications
Why Will Angular 2 Rock?
Angular style guide
TypeScript Roadmap
QUESTIONS?
Want to work with us at Serenytics?
Interested by Analytics, BI and Startups?
Passionate about Angular and TypeScript? Love Python?
Come and see me, we're looking for an amazing dev /
startuper!
Or contact me at adrien.chauve@serenytics.com

More Related Content

What's hot

Automated Xcode 7 UI Testing
Automated Xcode 7 UI TestingAutomated Xcode 7 UI Testing
Automated Xcode 7 UI Testing
Jouni Miettunen
 
Introduction to Angularjs
Introduction to AngularjsIntroduction to Angularjs
Introduction to Angularjs
Manish Shekhawat
 
Introduction to Angular 2
Introduction to Angular 2Introduction to Angular 2
Introduction to Angular 2
Naveen Pete
 
Angular Introduction By Surekha Gadkari
Angular Introduction By Surekha GadkariAngular Introduction By Surekha Gadkari
Angular Introduction By Surekha Gadkari
Surekha Gadkari
 
JSF Custom Components
JSF Custom ComponentsJSF Custom Components
JSF Custom Components
Michael Fons
 
Angular 5 presentation for beginners
Angular 5 presentation for beginnersAngular 5 presentation for beginners
Angular 5 presentation for beginners
Imran Qasim
 
5 angularjs features
5 angularjs features5 angularjs features
5 angularjs features
Alexey (Mr_Mig) Migutsky
 
Angular2 with TypeScript
Angular2 with TypeScript Angular2 with TypeScript
Angular2 with TypeScript
Rohit Bishnoi
 
Android training day 1
Android training day 1Android training day 1
Android training day 1
Vivek Bhusal
 
Xcode 7 UI Testing - Xcake Dublin, October 2015
Xcode 7 UI Testing - Xcake Dublin, October 2015Xcode 7 UI Testing - Xcake Dublin, October 2015
Xcode 7 UI Testing - Xcake Dublin, October 2015
roland99
 
Ui 5
Ui   5Ui   5
What's new and exciting with JSF 2.0
What's new and exciting with JSF 2.0What's new and exciting with JSF 2.0
What's new and exciting with JSF 2.0
Michael Fons
 
2. 엔티티 매핑(entity mapping) 2 2 엔티티매핑 2-2-4. 식별자 자동 생성(@generated-value) part2
2. 엔티티 매핑(entity mapping) 2 2 엔티티매핑 2-2-4. 식별자 자동 생성(@generated-value) part22. 엔티티 매핑(entity mapping) 2 2 엔티티매핑 2-2-4. 식별자 자동 생성(@generated-value) part2
2. 엔티티 매핑(entity mapping) 2 2 엔티티매핑 2-2-4. 식별자 자동 생성(@generated-value) part2
탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Angular 1.x in action now
Angular 1.x in action nowAngular 1.x in action now
Angular 1.x in action now
GDG Odessa
 
Angular 2 - The Next Framework
Angular 2 - The Next FrameworkAngular 2 - The Next Framework
Angular 2 - The Next Framework
Commit University
 
Understanding Angular 2 - Shmuela Jacobs - Codemotion Milan 2016
Understanding Angular 2 - Shmuela Jacobs - Codemotion Milan 2016Understanding Angular 2 - Shmuela Jacobs - Codemotion Milan 2016
Understanding Angular 2 - Shmuela Jacobs - Codemotion Milan 2016
Codemotion
 
Angular Mini-Challenges
Angular Mini-ChallengesAngular Mini-Challenges
Angular Mini-Challenges
Jose Mendez
 
From mvc to viper
From mvc to viperFrom mvc to viper
From mvc to viper
Krzysztof Profic
 
iOS Layout Overview
iOS Layout OverviewiOS Layout Overview
iOS Layout Overview
Make School
 
Angular js
Angular jsAngular js
Angular js
Behind D Walls
 

What's hot (20)

Automated Xcode 7 UI Testing
Automated Xcode 7 UI TestingAutomated Xcode 7 UI Testing
Automated Xcode 7 UI Testing
 
Introduction to Angularjs
Introduction to AngularjsIntroduction to Angularjs
Introduction to Angularjs
 
Introduction to Angular 2
Introduction to Angular 2Introduction to Angular 2
Introduction to Angular 2
 
Angular Introduction By Surekha Gadkari
Angular Introduction By Surekha GadkariAngular Introduction By Surekha Gadkari
Angular Introduction By Surekha Gadkari
 
JSF Custom Components
JSF Custom ComponentsJSF Custom Components
JSF Custom Components
 
Angular 5 presentation for beginners
Angular 5 presentation for beginnersAngular 5 presentation for beginners
Angular 5 presentation for beginners
 
5 angularjs features
5 angularjs features5 angularjs features
5 angularjs features
 
Angular2 with TypeScript
Angular2 with TypeScript Angular2 with TypeScript
Angular2 with TypeScript
 
Android training day 1
Android training day 1Android training day 1
Android training day 1
 
Xcode 7 UI Testing - Xcake Dublin, October 2015
Xcode 7 UI Testing - Xcake Dublin, October 2015Xcode 7 UI Testing - Xcake Dublin, October 2015
Xcode 7 UI Testing - Xcake Dublin, October 2015
 
Ui 5
Ui   5Ui   5
Ui 5
 
What's new and exciting with JSF 2.0
What's new and exciting with JSF 2.0What's new and exciting with JSF 2.0
What's new and exciting with JSF 2.0
 
2. 엔티티 매핑(entity mapping) 2 2 엔티티매핑 2-2-4. 식별자 자동 생성(@generated-value) part2
2. 엔티티 매핑(entity mapping) 2 2 엔티티매핑 2-2-4. 식별자 자동 생성(@generated-value) part22. 엔티티 매핑(entity mapping) 2 2 엔티티매핑 2-2-4. 식별자 자동 생성(@generated-value) part2
2. 엔티티 매핑(entity mapping) 2 2 엔티티매핑 2-2-4. 식별자 자동 생성(@generated-value) part2
 
Angular 1.x in action now
Angular 1.x in action nowAngular 1.x in action now
Angular 1.x in action now
 
Angular 2 - The Next Framework
Angular 2 - The Next FrameworkAngular 2 - The Next Framework
Angular 2 - The Next Framework
 
Understanding Angular 2 - Shmuela Jacobs - Codemotion Milan 2016
Understanding Angular 2 - Shmuela Jacobs - Codemotion Milan 2016Understanding Angular 2 - Shmuela Jacobs - Codemotion Milan 2016
Understanding Angular 2 - Shmuela Jacobs - Codemotion Milan 2016
 
Angular Mini-Challenges
Angular Mini-ChallengesAngular Mini-Challenges
Angular Mini-Challenges
 
From mvc to viper
From mvc to viperFrom mvc to viper
From mvc to viper
 
iOS Layout Overview
iOS Layout OverviewiOS Layout Overview
iOS Layout Overview
 
Angular js
Angular jsAngular js
Angular js
 

Similar to Feedback using Angularjs + Typescript at Serenytics

Angular1x and Angular 2 for Beginners
Angular1x and Angular 2 for BeginnersAngular1x and Angular 2 for Beginners
Angular1x and Angular 2 for Beginners
Oswald Campesato
 
introduction to Angularjs basics
introduction to Angularjs basicsintroduction to Angularjs basics
introduction to Angularjs basics
Ravindra K
 
OpenDaylight Developer Experience 2.0
 OpenDaylight Developer Experience 2.0 OpenDaylight Developer Experience 2.0
OpenDaylight Developer Experience 2.0
Michael Vorburger
 
Suite Script 2.0 API Basics
Suite Script 2.0 API BasicsSuite Script 2.0 API Basics
Suite Script 2.0 API Basics
Jimmy Butare
 
Angular workshop - Full Development Guide
Angular workshop - Full Development GuideAngular workshop - Full Development Guide
Angular workshop - Full Development Guide
Nitin Giri
 
AngularJS 1.x training
AngularJS 1.x trainingAngularJS 1.x training
AngularJS 1.x training
Roberto Ramadhin
 
Angular js meetup
Angular js meetupAngular js meetup
Angular js meetup
Anton Kropp
 
Building scalable applications with angular js
Building scalable applications with angular jsBuilding scalable applications with angular js
Building scalable applications with angular js
Andrew Alpert
 
From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)
Jose Manuel Pereira Garcia
 
Models, controllers and views
Models, controllers and viewsModels, controllers and views
Models, controllers and views
priestc
 
AngularJS Workshop
AngularJS WorkshopAngularJS Workshop
AngularJS Workshop
Gianluca Cacace
 
angularJs Workshop
angularJs WorkshopangularJs Workshop
angularJs Workshop
Ran Wahle
 
Introduction to Angular 2
Introduction to Angular 2Introduction to Angular 2
Introduction to Angular 2
Knoldus Inc.
 
AngularJs Workshop SDP December 28th 2014
AngularJs Workshop SDP December 28th 2014AngularJs Workshop SDP December 28th 2014
AngularJs Workshop SDP December 28th 2014
Ran Wahle
 
AngularJs Style Guide
AngularJs Style GuideAngularJs Style Guide
AngularJs Style Guide
Chiew Carol
 
AngularJs Crash Course
AngularJs Crash CourseAngularJs Crash Course
AngularJs Crash Course
Keith Bloomfield
 
using Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API's
Antônio Roberto Silva
 
Angular Presentation
Angular PresentationAngular Presentation
Angular Presentation
Adam Moore
 
Building a dashboard using AngularJS
Building a dashboard using AngularJSBuilding a dashboard using AngularJS
Building a dashboard using AngularJS
RajthilakMCA
 
Angularjs Basics
Angularjs BasicsAngularjs Basics
Angularjs Basics
Anuradha Bandara
 

Similar to Feedback using Angularjs + Typescript at Serenytics (20)

Angular1x and Angular 2 for Beginners
Angular1x and Angular 2 for BeginnersAngular1x and Angular 2 for Beginners
Angular1x and Angular 2 for Beginners
 
introduction to Angularjs basics
introduction to Angularjs basicsintroduction to Angularjs basics
introduction to Angularjs basics
 
OpenDaylight Developer Experience 2.0
 OpenDaylight Developer Experience 2.0 OpenDaylight Developer Experience 2.0
OpenDaylight Developer Experience 2.0
 
Suite Script 2.0 API Basics
Suite Script 2.0 API BasicsSuite Script 2.0 API Basics
Suite Script 2.0 API Basics
 
Angular workshop - Full Development Guide
Angular workshop - Full Development GuideAngular workshop - Full Development Guide
Angular workshop - Full Development Guide
 
AngularJS 1.x training
AngularJS 1.x trainingAngularJS 1.x training
AngularJS 1.x training
 
Angular js meetup
Angular js meetupAngular js meetup
Angular js meetup
 
Building scalable applications with angular js
Building scalable applications with angular jsBuilding scalable applications with angular js
Building scalable applications with angular js
 
From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)From Legacy to Hexagonal (An Unexpected Android Journey)
From Legacy to Hexagonal (An Unexpected Android Journey)
 
Models, controllers and views
Models, controllers and viewsModels, controllers and views
Models, controllers and views
 
AngularJS Workshop
AngularJS WorkshopAngularJS Workshop
AngularJS Workshop
 
angularJs Workshop
angularJs WorkshopangularJs Workshop
angularJs Workshop
 
Introduction to Angular 2
Introduction to Angular 2Introduction to Angular 2
Introduction to Angular 2
 
AngularJs Workshop SDP December 28th 2014
AngularJs Workshop SDP December 28th 2014AngularJs Workshop SDP December 28th 2014
AngularJs Workshop SDP December 28th 2014
 
AngularJs Style Guide
AngularJs Style GuideAngularJs Style Guide
AngularJs Style Guide
 
AngularJs Crash Course
AngularJs Crash CourseAngularJs Crash Course
AngularJs Crash Course
 
using Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API'susing Mithril.js + postgREST to build and consume API's
using Mithril.js + postgREST to build and consume API's
 
Angular Presentation
Angular PresentationAngular Presentation
Angular Presentation
 
Building a dashboard using AngularJS
Building a dashboard using AngularJSBuilding a dashboard using AngularJS
Building a dashboard using AngularJS
 
Angularjs Basics
Angularjs BasicsAngularjs Basics
Angularjs Basics
 

Recently uploaded

Microservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we workMicroservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we work
Sven Peters
 
SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024
Hironori Washizaki
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
SOCRadar
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
Philip Schwarz
 
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsUI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
Peter Muessig
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Neo4j
 
Revolutionizing Visual Effects Mastering AI Face Swaps.pdf
Revolutionizing Visual Effects Mastering AI Face Swaps.pdfRevolutionizing Visual Effects Mastering AI Face Swaps.pdf
Revolutionizing Visual Effects Mastering AI Face Swaps.pdf
Undress Baby
 
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j
 
E-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet DynamicsE-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet Dynamics
Hornet Dynamics
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
Aftab Hussain
 
Oracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptxOracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptx
Remote DBA Services
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
Hornet Dynamics
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptxLORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
lorraineandreiamcidl
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
Safe Software
 
Webinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for EmbeddedWebinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for Embedded
ICS
 
GreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-JurisicGreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-Jurisic
Green Software Development
 
How to write a program in any programming language
How to write a program in any programming languageHow to write a program in any programming language
How to write a program in any programming language
Rakesh Kumar R
 
Energy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina JonuziEnergy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina Jonuzi
Green Software Development
 
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j
 
SMS API Integration in Saudi Arabia| Best SMS API Service
SMS API Integration in Saudi Arabia| Best SMS API ServiceSMS API Integration in Saudi Arabia| Best SMS API Service
SMS API Integration in Saudi Arabia| Best SMS API Service
Yara Milbes
 

Recently uploaded (20)

Microservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we workMicroservice Teams - How the cloud changes the way we work
Microservice Teams - How the cloud changes the way we work
 
SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024SWEBOK and Education at FUSE Okinawa 2024
SWEBOK and Education at FUSE Okinawa 2024
 
socradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdfsocradar-q1-2024-aviation-industry-report.pdf
socradar-q1-2024-aviation-industry-report.pdf
 
Hand Rolled Applicative User Validation Code Kata
Hand Rolled Applicative User ValidationCode KataHand Rolled Applicative User ValidationCode Kata
Hand Rolled Applicative User Validation Code Kata
 
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling ExtensionsUI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
UI5con 2024 - Boost Your Development Experience with UI5 Tooling Extensions
 
Atelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissancesAtelier - Innover avec l’IA Générative et les graphes de connaissances
Atelier - Innover avec l’IA Générative et les graphes de connaissances
 
Revolutionizing Visual Effects Mastering AI Face Swaps.pdf
Revolutionizing Visual Effects Mastering AI Face Swaps.pdfRevolutionizing Visual Effects Mastering AI Face Swaps.pdf
Revolutionizing Visual Effects Mastering AI Face Swaps.pdf
 
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
 
E-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet DynamicsE-commerce Development Services- Hornet Dynamics
E-commerce Development Services- Hornet Dynamics
 
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of CodeA Study of Variable-Role-based Feature Enrichment in Neural Models of Code
A Study of Variable-Role-based Feature Enrichment in Neural Models of Code
 
Oracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptxOracle Database 19c New Features for DBAs and Developers.pptx
Oracle Database 19c New Features for DBAs and Developers.pptx
 
E-commerce Application Development Company.pdf
E-commerce Application Development Company.pdfE-commerce Application Development Company.pdf
E-commerce Application Development Company.pdf
 
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptxLORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
LORRAINE ANDREI_LEQUIGAN_HOW TO USE WHATSAPP.pptx
 
Essentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FMEEssentials of Automations: The Art of Triggers and Actions in FME
Essentials of Automations: The Art of Triggers and Actions in FME
 
Webinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for EmbeddedWebinar On-Demand: Using Flutter for Embedded
Webinar On-Demand: Using Flutter for Embedded
 
GreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-JurisicGreenCode-A-VSCode-Plugin--Dario-Jurisic
GreenCode-A-VSCode-Plugin--Dario-Jurisic
 
How to write a program in any programming language
How to write a program in any programming languageHow to write a program in any programming language
How to write a program in any programming language
 
Energy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina JonuziEnergy consumption of Database Management - Florina Jonuzi
Energy consumption of Database Management - Florina Jonuzi
 
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit ParisNeo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
Neo4j - Product Vision and Knowledge Graphs - GraphSummit Paris
 
SMS API Integration in Saudi Arabia| Best SMS API Service
SMS API Integration in Saudi Arabia| Best SMS API ServiceSMS API Integration in Saudi Arabia| Best SMS API Service
SMS API Integration in Saudi Arabia| Best SMS API Service
 

Feedback using Angularjs + Typescript at Serenytics

  • 1. FEEDBACK ANGULARJS + TYPESCRIPT AT SERENYTICS TypeScript meetup #2 - Paris 2015-06-10 Adrien Chauve CTO @adrienchauve @Serenytics
  • 2. DISCLAIMER I'm not a TypeScript expert, nor an AngularJS expert! But it's better if you know some to follow this talk ;-)
  • 3. CONTENTS 1. 2. 3. 4. What we do: Dashboards and Widgets Why moving to TypeScript? Angular + TypeScript: HowTo? The Good, the Bad and the Ugly
  • 4. 1. WHAT WE DO: DASHBOARDS AND WIDGETS
  • 5. 1. WHAT WE DO: DASHBOARDS AND WIDGETS Year -- All -- Product -- All -- Country -- All --  13  $1,034  $339
  • 6. 1. WHAT WE DO: DASHBOARDS AND WIDGETS Initial question: we use AngularJS with lots of different widgets how to reuse as much code as possible? while still being able to tune each widget appearance Solutions: Service: not enough (factorize logic but not UI interactions) Single generic directive: single template problem Directive composition: a generic base directive plus several small directives to adapt the template and behavior TypeScript to the rescue, and much much more!
  • 7. 2. WHY MOVING TO TYPESCRIPT?
  • 8. 2. WHY MOVING TO TYPESCRIPT? (1/2) Potential good solution to factorize our code (more on that later) All the goodness of ES6 (classes, fat arrow, template strings, soon async/await, ...), plus: statically typed automatic feedback while developing (think gulp/grunt watch) interfaces! description of complex types (e.g. widget data model) available in a single place and not spread around the code (Angular is really persmissive for models)
  • 9. 2. WHY MOVING TO TYPESCRIPT? (2/2) It's just a Javascript superset, so the migration can be incremental and smooth, no need to rewrite the app from scratch really easy integration with Angular (even if a little scary at first) forces to use classes, and then better organize the code (again Angular is really permissive) Angular2 is written in TypeScript: Google + Microsoft are now supporting it
  • 10. 3. ANGULAR + TYPESCRIPT: HOWTO?
  • 11. 3. ANGULAR + TYPESCRIPT: THE BASICS Controller Service Directive
  • 12. 3. ANGULAR + TYPESCRIPT: THE BASICS - CONTROLLERS Using ControllerAs syntax, a controller is just a Class angular .module('my-lib') .controller('LoginController', LoginController); $stateProvider .state('login', { url: '/login', templateUrl: 'mylib/auth/login.template.html', controller: 'LoginController', controllerAs: 'vm' })
  • 13. 3. ANGULAR + TYPESCRIPT: THE BASICS - CONTROLLERS Example in ES5: var LoginController = (function () { function LoginController(loginService, $state) { this.loginService = loginService; this.$state = $state; this.invalidCredentials = false; if (loginService.isLogged) { $state.transitionTo('home'); } } LoginController.prototype.login = function () { var _this = this; this.invalidCredentials = false; this.loginService.loginWithCrendentials(this.email, this.password) .catch(function () { _this.invalidCredentials = true; }); }; return LoginController; })();
  • 14. 3. ANGULAR + TYPESCRIPT: THE BASICS - CONTROLLERS Example in TypeScript: lots of goodness in it class LoginController { invalidCredentials = false; email: string; password: string; constructor(private loginService: ILoginService, private $state: angular.ui.IStateService) { if (loginMgr2.isLogged) { $state.transitionTo('home'); } } login () { this.invalidCredentials = false; this.loginService.loginWithCrendentials(this.email, this.password) .catch(() => { this.invalidCredentials = true; }); } }
  • 15. 3. ANGULAR + TYPESCRIPT: THE BASICS - SERVICES Just like Controllers: class LoginService { constructor(private Restangular: restangular.IService) { } loginWithCrendentials (email: string, password: string) { return this.Restangular.one('api/token') .then((apiData) => { // ... save token // ... transition to 'home' state }); } } angular .module('my-lib') .service(loginService, LoginService);
  • 16. 3. ANGULAR + TYPESCRIPT: THE BASICS - DIRECTIVES interface IWidgetDirectiveScope extends ng.IScope { widgetModel: IWidgetModel; } class WidgetDirective { scope = { widgetModel: '=', }; restrict = 'E'; replace = true; controllerAs = 'vm' templateUrl = 'components/widgets/widget.directive.html'; controller = WidgetController; link = (scope: IWidgetDirectiveScope, element: ng.IAugmentedJQuery, attrs: ng.IAttributes, controller: WidgetController) => { // ... } } angular.module('my-lib').directive('my-widget', () => { return new WidgetDirective(); });
  • 17. 3. ANGULAR + TYPESCRIPT: EVEN MORE! ok Angular + TypeScript is cool, but what about code reuse and our initial question? Lots of common behavior between table widget / value widget (= single cell table) all chart widgets (pie chart, bar chart, curve chart, ...)
  • 18. 3. ANGULAR + TYPESCRIPT: REUSE CODE! Different ways: keep the same controller, adapt the template, 2 directives for the same price! inherit base controller to inherit basic behavior exposed to the view (think Mixins when available) refresh state (reload data from API) error handling global data filtering data export implement models (e.g. Widgets) as classes completely outside of Angular's world
  • 19. 3. ANGULAR + TYPESCRIPT: OUR SOLUTION FOR CODE REUSE keep directives small and simple, and have several if needed each customized with its own template with possibly one base directive to factorize $scope features and simple properties (replace, ControllerAs, ...) one base controller and several inherited controllers as needed pure TypeScript Widget classes without any Angular dependency (model/business logic)
  • 20. 4. THE GOOD, THE BAD AND THE UGLY
  • 21. 4. ANGULAR + TYPESCRIPT: THE GOOD PARTS easy integration with Angular, especially with ControllerAs since 1.2 even encourage to use best practises for Angular 2 (ControllerAs => Components) incremental migration (superset + gradual typing with any) type infos, type inference and all the good that comes with it Interfaces: all the model in one place! Good debugging experience using source maps with Chrome
  • 22. 4. ANGULAR + TYPESCRIPT: THE BAD PARTS (1/2) using 3rd party libraries (missing or outdated typed definitions): but not such a great problem dev environment a little more complex (gulp, tsc, tslint, tsd): actually not so much pain a little more work sometimes (adding types, directives more verbose)
  • 23. 4. ANGULAR + TYPESCRIPT: THE BAD PARTS (2/2) Dealing with class hierarchies: compromise between testability and verbosity class BaseWidgetController { private _data: IData; constructor(private globalFilterService: GlobalFilterService /* other depende filterData () { return this.globalFilterService.applyFilters(this._data); } } class TableWidgetController extends BaseWidgetController { constructor(private globalFilterService: GlobalFilterService /* other depende super(globalFilterService, ....); } } /* less verbose alternative - dangerous */ class GlobalFilterService { /* WARNING: bypass Angular DI and make testing more complex */ static instance() { angular.element(document.body).injector().get('globalFilterService' } applyFilters(...) {...} } class BaseWidgetController { private _data: IData;
  • 24. constructor() {} filterData () { return GlobalFilterService.instance().applyFilters(this }
  • 25. 4. ANGULAR + TYPESCRIPT: UGLY PARTS? Not really... or maybe when coding e2e tests with Protractor + TypeScript: incompatible Promises types // selenimum-webdriver type declaration interface IThenable<T> { then<R>(opt_callback?: (value: T) => Promise<R>, opt_errback?: (error: then<R>(opt_callback?: (value: T) => R, opt_errback?: (error: any) => any): P } // vs. ES6 type declaration interface Thenable<R> { then<U>(onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: then<U>(onFulfilled?: (value: R) => U | Thenable<U>, onRejected?: (error: } Good luck if you use nodejs with Q.denodeify or Bluebird.promisify
  • 26. TOWARDS ANGULAR 2.0: ANGULAR IN TYPESCRIPT If you: have a growing project in Angular 1.X want to invest on it for the next couple of years Do you a favor, go for TypeScript! Congrats! you'll be half way through the migration to Angular2! Angular 2: everything becomes a TypeScript class with annotations (Component, Directive)
  • 27. REFERENCES Course @ Pluralsight by @Foxandxss by @john_papa Using TypeScript for Large AngularJS Applications Why Will Angular 2 Rock? Angular style guide TypeScript Roadmap
  • 28. QUESTIONS? Want to work with us at Serenytics? Interested by Analytics, BI and Startups? Passionate about Angular and TypeScript? Love Python? Come and see me, we're looking for an amazing dev / startuper! Or contact me at adrien.chauve@serenytics.com