SlideShare ist ein Scribd-Unternehmen logo
1 von 88
Downloaden Sie, um offline zu lesen
HOW TO MESS UP
YOUR ANGULAR UI COMPONENTS
ÇAĞATAY ÇİVİCİ
ÇAGATAY ÇIVICI
▸ PrimeFaces, PrimeNG, PrimeReact, PrimeUI
▸ Java Champion
▸ Founder of PrimeTek
▸ Front-end developer
▸ Current Interests: Fitness and Spanish
JAVASERVER FACES
JQUERY
MODERN WEB DEV
ANGULAR JS TO ANGULAR 2
ANGULAR X
REACT
UI SUITES
OPEN SOURCE
(MIT)
PRIMENG - 80+ OPEN SOURCE UI COMPONENTS
TEMPLATES
ONE-WAY VS TWO-WAY BINDING
<my-component [size]="value">
export class MyComponent {
size: number;
}
ONE-WAY VS TWO-WAY BINDING
<my-component [(size)]="value">
<my-component [size]="value" (sizeChange)="value = $event">
export class MyComponent {
size: number;
sizeChange: EventEmitter<number> = new EventEmitter<number>();
zoomIn(event: Event) {
this.sizeChange.emit(this.size + 2);
}
}
NG-MODEL
<input type="text" [(ngModel)]="name">
export class MyComponent {
name: string;
}
HOW TO SUPPORT NG-MODEL
<my-calendar [(ngModel)]="date">
@Component({
selector: 'my-calendar',
template: '…'
})
export class MyCalendar {
value: Date;
}
CAN'T BIND TO NGMODEL SINCE IT ISN'T A KNOWN PROPERTY
CONTROLVALUEACCESSOR
interface ControlValueAccessor {
writeValue(obj: any) : void
registerOnChange(fn: any) : void
registerOnTouched(fn: any) : void
setDisabledState(isDisabled: boolean) : void
}
VALUE ACCESSOR
import {NG_VALUE_ACCESSOR,
ControlValueAccessor} from '@angular/forms';
STEP 1
VALUE ACCESSOR
export const MY_CALENDAR_VALUE_ACCESSOR: any = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => MyCalendar),
multi: true
};
STEP 2
VALUE ACCESSOR
STEP 3
@Component({
selector: 'my-component',
template: '…',
providers: [MY_CALENDAR_VALUE_ACCESSOR]
})
export class MyCalendar implements ControlValueAccessor {
}
VALUE ACCESSOR STEP 4
export class MyCalendar implements ControlValueAccessor {
value: Date;
onModelChange: Function = () => {};
onModelTouched: Function = () => {};
@Input() disabled: boolean;
writeValue(value: any) : void { this.value = value; }
registerOnChange(fn: Function): void { this.onModelChange = fn; }
registerOnTouched(fn: Function): void { this.onModelTouched = fn; }
setDisabledState(val: boolean): void { this.disabled = val; }
}
BIND VALUE
writeValue(value: any) : void {
this.value = value;
}
onClick(event: Event) : void {
this.onModelChange(this.value);
}
READ
WRITE
STATE CLASSES
onBlur(value: any) : void {
this.onModelTouched();
}
new FormControl({value:'', disabled:true})
ng-touched
ng-untouched
disabled
CASE STUDY: CALENDAR
CONTENT PROJECTION
<my-dialog>
<header>Quote of the Day</header>
I’m so mean, I make medicine sick!
</my-dialog>
ITEM DETAILS
I’m so mean, I make medicine sick!
X
CONTENT RELOCATION
@Component({
selector: 'my-dialog',
template: `
<div class="my-dlg">
<div class="my-dlg-header>
<ng-content select="header"><ng-content>
</div>
<div class="my-dlg-content">
<ng-content><ng-content>
<div>
</div>
`
})
export class MyDialog {
}
CONTENT QUERY
<my-dialog>
<my-header>Item Details</my-header>
Item Content
</my-dialog>
CONTENT QUERY
@Component({
selector: 'my-dialog',
template: `
<div class="my-dlg">
<div class="my-dlg-header>
<ng-content select="my-header"><ng-content>
</div>
<div class="my-dlg-content">
<ng-content><ng-content>
<div>
</div>
`
})
export class MyDialog {
} MY-HEADER IS NOT A KNOWN ELEMENT
CONTENT QUERY
@Component({
selector: 'my-header',
template: '<ng-content></ng-content>'
})
export class MyHeader {}
CONTENT QUERY
@Component({
selector: 'my-dialog',
template: `
<div class="my-dlg">
<div class="my-dlg-header *ngIf="header">
<ng-content select="my-header"><ng-content>
</div>
<div class="my-dlg-content">
<ng-content><ng-content>
<div>
</div>
`
})
export class MyDialog {
@ContentChild(MyHeader) header;
}
CASE STUDY: DIALOG
CHANGES TO CHILDREN
<my-table>
<my-col field="name"></my-col>
<my-col field="age"></my-col>
<my-col *ngIf="test" field="gender"></my-col>
</my-table>
CONTENT QUERY
@Component({
selector: 'my-table',
template: ` <div class="my-table">
…
</div>`
})
export class MyTable implements AfterContentInit {
@ContentChildren(Col) cols: QueryList<Col>;
columns: Column[];
ngAfterContentInit() {
this.columns = this.cols.toArray();
this.cols.changes.subscribe(_ =>
this.columns = this.cols.toArray(); );
}
}
CASE STUDY: TABVIEW
TEMPLATING
<div *ngFor="let obj of value">
{{obj}}
</div>
<template ngFor let-obj [ngForOf]="value">
<div>{obj}</div>
</template>
TEMPLATING
<my-list [value]="cars">
<ng-template let-car>
{{car.brand}}
</ng-template>
</my-list>
TEMPLATING
@Component({
selector: 'my-list',
template: `
<ul class="my-list">
<template *ngFor="let obj of value" [ngForTemplate]="tmpl">
<template>
</ul>`
})
export class MyTable implements AfterContentInit {
@ContentChild(TemplateRef) tmpl: TemplateRef;
@Input value: any[];
}
<ul class="my-list">BMW Ford Mercedes…</ul>
TEMPLATING
<my-list [value]="cars">
<ng-template let-car>
<li>{{car.brand}}</li>
</ng-template>
</my-list>
TEMPLATE WRAPPER
@Directive({
selector: '[myTemplateWrapper]'
})
export class MyTemplateWrapper implements OnInit, OnDestroy {
@Input() item: any;
@Input('myTemplateWrapper') templateRef: TemplateRef<any>;
view: EmbeddedViewRef<any>;
constructor(public viewContainer: ViewContainerRef) {}
ngOnInit() {
this.view = this.viewContainer.createEmbeddedView(this.templateRef, {
'$implicit': this.item,
'index': this.index
});
}
ngOnDestroy() { this.view.destroy(); }
}
TEMPLATING
@Component({
selector: 'my-list',
template: `
<ul class="my-list">
<li *ngFor="let obj of value" (onClick)="…">
<ng-template [myTemplateWrapper]="tmpl"
[item]="obj"><ng-template>
<li>
</ul>`
})
export class MyList implements AfterContentInit {
@ContentChild(TemplateRef) tmpl: TemplateRef;
@Input value: any[];
}
*NGTEMPLATEOUTLET TO THE RESCUE
@Component({
selector: 'my-list',
template: `
<ul class="my-list">
<li *ngFor="let obj of value; let i = index" (onClick)="…">
<ng-container *ngTemplateOutlet="tmpl; context: {
$implicit: obj, index: }"><ng-container>
<li>
</ul>`
})
export class MyList implements AfterContentInit {
@ContentChild(TemplateRef) tmpl: TemplateRef;
@Input value: any[];
}
TEMPLATING
<my-list [value]="cars">
<ng-template let-car let-i=“index”>
{{i}} - {{car.brand}}
</ng-template>
</my-list>
CASE STUDY: DATAVIEW AND LISTBOX
NGCONTAINER
<div *ngIf=“item.visible” *ngFor=“let item of items”>
<p>{{item}}</p><input type=“text”>
</div>
<div *ngFor=“let item of items”>
<div *ngIf=“item.visible”>
<p>{{item}}</p><input type=“text”>
</div>
</div>
<div *ngFor=“let item of items”>
<ng-container *ngIf=“item.visible”>
<p>{{item}}</p>
</ng-container>
</div>
NGCONTAINER
CHANGE DETECTION
CD
CD CD
CD CD CD CD
CHANGE DETECTION
SETTER ONCHANGES DOCHECK
ONCHANGES
<my-comp [name]="value">
@Component({selector: 'my-comp', template: `...`})
class MyComponent implements OnChanges {
@Input() name: string;
ngOnChanges(changes: SimpleChanges) {
// changes.prop contains the old and the new value...
}
}
PROBLEM WITH NGONCHANGES
NOT INTUITIVE
ngOnChanges(changes: SimpleChanges) {
if(changes[‘totalRecords’]) //do this
else if(changes[‘rows’]) // do that
else if(changes[‘disabled’]) //come on!!!
}
NGDOCHECK
<my-list [value]="total">
@Component({selector: 'my-list',template: '…'})
export class MyList implements DoCheck {
@Input() value: any[];
differ: any;
constructor(differs: IterableDiffers) {
this.differ = differs.find([]).create(null);
}
ngDoCheck() {
let changes = this.differ.diff(this.value); //performance???
if(changes) {
//…
}
}
}
CASE STUDY: GOOGLE MAPS
SETTER
<my-paginator [totalRecords]="total">
@Component({
selector: 'my-paginator',
template: '…'
})
export class MyPaginator {
@Input() totalRecords: number;
}
SETTER
@Component({
selector: 'my-paginator',
template: '…<a href="#" *ngFor="let p of pageLinks" …>{{p}}}</a>…'
})
export class MyPaginator {
public pageLinks: number[];
public _totalRecords: number = 0;
@Input() get totalRecords(): number {
return this._totalRecords;
}
set totalRecords(val:number) {
this._totalRecords = val;
this.updatePageLinks();
}
updatePageLinks() { //calculate page links }
}
CASE STUDY: PAGINATOR
PROBLEM WITH SETTER
NOT CALLED WHEN AN ARRAY CHANGES
<my-comp [value]="arr">
this.arr.push('beer'); this.arr = […this.arr, 'beer'];
CHANGE DETECTION PERFORMANCE
CD
CD CD
CD CD CD CD
PUSH STRATEGY
@Component({
selector: 'my-component',
template: ‘<my-user [user]=“user”><my-user>’
})
export class MyComponent {
ngOnInit() {
this.user = //fetch user
}
changeUser() {
this.user.name = ‘Emir’;
}
}
PUSH STRATEGY
@Component({
selector: 'my-user',
template: ‘{{user.name}}’
})
export class MyUser {
@Input() user: User;
}
@Component({
selector: ‘my-user',
changeDetection: ChangeDetectionStrategy.OnPush
template: ‘{{user.name}}’
})
export class MyUser {
@Input() user: User;
}
PUSH STRATEGY
@Component({
selector: 'my-component',
template: ‘<my-user [user]=“user”><my-user>’
})
export class MyComponent {
ngOnInit() {
this.user = //fetch user
}
changeUser() {
this.user = new User();
this.user.name = ‘Emir’;
}
}
CHANGE DETECTOR CONTROL
import {Component,ChangeDetectorRef} from ‘@angular/core’;
@Component({
selector: 'my-component',
template: ‘<my-user [user]=“user”><my-user>’
})
export class MyComponent {
constructor(private cd: ChangeDetectorRef) {}
someMethod(event: Event) {
this.cd.detectChanges();
}
}
CASE STUDY: DROPDOWN
CHANGE DETECTION REVISITED
EVENTS
(CLICK)
XHR TIMERS
MONKEY PATCHING
A monkey patch is a way for a program to extend or
modify supporting system software locally
(affecting only the running instance of the program).
ZONE API
GAME OF ZONES - PERFORMANCE
<div draggable (dragover)=“handleDrag($event)”>
GAME OF ZONES - PERFORMANCE
dragOverListener: Function;
bindEvents() {
this.zone.runOutsideAngular(() => {
this.dragOverListener = this.onDragOver.bind(this);
this.el.nativeElement.addEventListener('dragover', this.dragOverListener);
});
}
ngOnDestroy() {
if (this.dragOverListener) {
document.removeEventListener('dragover', this.dragOverListener);
this.dragOverListener = null;
}
}
CASE STUDY: TURBOTABLE
GAME OF ZONES
@Component({selector: 'my-gmap',template: '…'})
export class MyGMap implements AfterViewChecked {
constructor(public cd: ChangeDetectorRef, public zone:NgZone) {}
ngAfterViewInit() {
this.map = new google.maps.Map(
this.el.nativeElement.children[0], this.options);
this.map.addListener('click', (event) => {
this.zone.run(() => {
this.onMapClick.emit(event);
});
});
}
}
CASE STUDY: GOOGLE MAPS
COMPONENT COMMUNICATION VIA SERVICE
<my-tree [value]="nodes1">
<my-tree [value]="nodes2">
<my-tree [value]="nodes3">
COMPONENT COMMUNICATION VIA SERVICE
@Injectable()
export class TreeDragDropService {
private dragStartSource = new Subject<TreeNodeDragEvent>();
private dragStopSource = new Subject<TreeNodeDragEvent>();
dragStart$ = this.dragStartSource.asObservable();
dragStop$ = this.dragStopSource.asObservable();
startDrag(event: TreeNodeDragEvent) {
this.dragStartSource.next(event);
}
stopDrag(event: TreeNodeDragEvent) {
this.dragStopSource.next(event);
}
}
COMPONENT COMMUNICATION VIA SERVICE
@Component
export class Tree implements OnInit {
constructor(@Optional() public dragDropService: TreeDragDropService) {}
ngOnInit() {
if(this.droppableNodes) {
this.dragStartSubscription = this.dragDropService.dragStart$.subscribe(
event => {
//get dragged node
});
this.dragStopSubscription = this.dragDropService.dragStop$.subscribe(
event => {
//get dropped node
});
}
CASE STUDY: CONFIRM DIALOG
CASE STUDY: TREE DRAG DROP
CASE STUDY: GROWL
CASE STUDY: TABLE
SERVICE HIERARCHY
TREE 1 TREE 2
MAIN
TREESERVICE TREESERVICE
SERVICE HIERARCHY
TREE 1 TREE 2
MAIN
TREESERVICE
ACCESS DOM
@Component({
selector: 'my-dialog',
template: '<div #containerEL><ng-content><ng/content></div>'
})
export class MyDialog implements AfterViewInit {
@ViewChild('containerEL') containerViewChild: ElementRef;
container: HTMLDivElement;
ngAfterViewInit() {
this.container = <HTMLDivElement> this.containerViewChild.nativeElement;
this.container.style.left = //
this.container.style.top = //
}
}
CASE STUDY: DROPDOWN
ACCESS DOM AFTER CHANGES TO DOM
@Component({
selector: 'my-dialog',
template: '<div #containerEL><ng-content><ng/content></div>'
})
export class MyDialog implements AfterViewChecked {
@ViewChild('containerEL') containerViewChild: ElementRef;
ngAfterViewChecked() {
this.containerViewChild.elementRef.style.left = //
this.containerViewChild.elementRef.style.top = //
}
}
CASE STUDY: AUTOCOMPLETE
GLOBAL EVENTS
@Component({selector: 'my-gmap',template: '…'})
export class MyGMap implements AfterViewChecked {
constructor(public cd: ChangeDetectorRef, public zone:NgZone) {}
ngAfterViewInit() {
this.map = new google.maps.Map(
this.el.nativeElement.children[0], this.options);
this.map.addListener('click', (event) => {
this.zone.run(() => {
this.onMapClick.emit(event);
});
});
}
}
@Component({selector: 'my-dialog',
template: '<div #containerEL><ng-content><ng/content></div>'
})
export class MyDialog implements AfterViewInit, OnDestroy {
constructor(public renderer: Renderer2);
public documentClickListener: any;
ngAfterViewInit() {
this.documentClickListener = this.renderer2.listenGlobal('body', 'click', () => {
//document clicked
}
}
ngOnDestroy() {
if(this.documentClickListener) this.documentClickListener();
}
}
CASE STUDY: DROPDOWN
PUSH CHANGE DETECTION STRATEGY
@Component({selector: 'my-dialog',
template: '<div #containerEL><ng-content><ng/content></div>'
})
export class MyDialog implements AfterViewInit, OnDestroy {
constructor(public renderer: Renderer2,private cd: ChangeDetectorRef);
public documentClickListener: any;
ngAfterViewInit() {
this.documentClickListener = this.renderer2.listenGlobal('body', 'click', () => {
//document clicked
this.cd.detectChanges();
}
}
ngOnDestroy() {
if(this.documentClickListener) this.documentClickListener();
}
CASE STUDY: DROPDOWN
TIPS
EXPRESSION WAS CHANGED AFTER IT WAS CHECKED
@Component({selector: 'my-dialog',
template: '{{test}}'
})
export class MyDialog implements AfterViewInit {
test: string;
ngAfterViewInit() {
this.test = 'PrimeNG';
}
}
3DR PARTY INTEGRATION
CASE STUDY: SCHEDULE
THANK YOU
@prime_ng

Weitere ähnliche Inhalte

Was ist angesagt?

Modules and injector
Modules and injectorModules and injector
Modules and injectorEyal Vardi
 
Egghead redux-cheat-sheet-3-2-1
Egghead redux-cheat-sheet-3-2-1Egghead redux-cheat-sheet-3-2-1
Egghead redux-cheat-sheet-3-2-1Augustin Bralley
 
Presentation technico-commercial-ruby-on-rails
Presentation technico-commercial-ruby-on-railsPresentation technico-commercial-ruby-on-rails
Presentation technico-commercial-ruby-on-railsNovelys
 
Simplified Android Development with Simple-Stack
Simplified Android Development with Simple-StackSimplified Android Development with Simple-Stack
Simplified Android Development with Simple-StackGabor Varadi
 
Introduction to Web Components
Introduction to Web ComponentsIntroduction to Web Components
Introduction to Web ComponentsFelix Arntz
 
Databinding and Performance-Tuning in Angular 2
Databinding and Performance-Tuning in Angular 2Databinding and Performance-Tuning in Angular 2
Databinding and Performance-Tuning in Angular 2Manfred Steyer
 
[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법Jeado Ko
 
Taming forms with React
Taming forms with ReactTaming forms with React
Taming forms with ReactGreeceJS
 
jQuery Rescue Adventure
jQuery Rescue AdventurejQuery Rescue Adventure
jQuery Rescue AdventureAllegient
 
Jquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript BasicsJquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript BasicsEPAM Systems
 
Angular 2.0 forms
Angular 2.0 formsAngular 2.0 forms
Angular 2.0 formsEyal Vardi
 
FormsKit: reactive forms driven by state. UA Mobile 2017.
FormsKit: reactive forms driven by state. UA Mobile 2017.FormsKit: reactive forms driven by state. UA Mobile 2017.
FormsKit: reactive forms driven by state. UA Mobile 2017.UA Mobile
 
Angular 2 Architecture (Bucharest 26/10/2016)
Angular 2 Architecture (Bucharest 26/10/2016)Angular 2 Architecture (Bucharest 26/10/2016)
Angular 2 Architecture (Bucharest 26/10/2016)Eyal Vardi
 
React.js workshop by tech47.in
React.js workshop by tech47.inReact.js workshop by tech47.in
React.js workshop by tech47.inJaikant Kumaran
 
Stay with React.js in 2020
Stay with React.js in 2020Stay with React.js in 2020
Stay with React.js in 2020Jerry Liao
 
Better Bullshit Driven Development [SeleniumCamp 2017]
Better Bullshit Driven Development [SeleniumCamp 2017]Better Bullshit Driven Development [SeleniumCamp 2017]
Better Bullshit Driven Development [SeleniumCamp 2017]automician
 

Was ist angesagt? (20)

Solid angular
Solid angularSolid angular
Solid angular
 
AngularJS
AngularJSAngularJS
AngularJS
 
Modules and injector
Modules and injectorModules and injector
Modules and injector
 
Egghead redux-cheat-sheet-3-2-1
Egghead redux-cheat-sheet-3-2-1Egghead redux-cheat-sheet-3-2-1
Egghead redux-cheat-sheet-3-2-1
 
Presentation technico-commercial-ruby-on-rails
Presentation technico-commercial-ruby-on-railsPresentation technico-commercial-ruby-on-rails
Presentation technico-commercial-ruby-on-rails
 
Simplified Android Development with Simple-Stack
Simplified Android Development with Simple-StackSimplified Android Development with Simple-Stack
Simplified Android Development with Simple-Stack
 
Introduction to Web Components
Introduction to Web ComponentsIntroduction to Web Components
Introduction to Web Components
 
Databinding and Performance-Tuning in Angular 2
Databinding and Performance-Tuning in Angular 2Databinding and Performance-Tuning in Angular 2
Databinding and Performance-Tuning in Angular 2
 
jQuery Presentasion
jQuery PresentasionjQuery Presentasion
jQuery Presentasion
 
[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법[FEConf Korea 2017]Angular 컴포넌트 대화법
[FEConf Korea 2017]Angular 컴포넌트 대화법
 
Taming forms with React
Taming forms with ReactTaming forms with React
Taming forms with React
 
jQuery Rescue Adventure
jQuery Rescue AdventurejQuery Rescue Adventure
jQuery Rescue Adventure
 
Jquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript BasicsJquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript Basics
 
Angular 2.0 forms
Angular 2.0 formsAngular 2.0 forms
Angular 2.0 forms
 
FormsKit: reactive forms driven by state. UA Mobile 2017.
FormsKit: reactive forms driven by state. UA Mobile 2017.FormsKit: reactive forms driven by state. UA Mobile 2017.
FormsKit: reactive forms driven by state. UA Mobile 2017.
 
Angular 2 Architecture (Bucharest 26/10/2016)
Angular 2 Architecture (Bucharest 26/10/2016)Angular 2 Architecture (Bucharest 26/10/2016)
Angular 2 Architecture (Bucharest 26/10/2016)
 
React.js workshop by tech47.in
React.js workshop by tech47.inReact.js workshop by tech47.in
React.js workshop by tech47.in
 
Jquery 3
Jquery 3Jquery 3
Jquery 3
 
Stay with React.js in 2020
Stay with React.js in 2020Stay with React.js in 2020
Stay with React.js in 2020
 
Better Bullshit Driven Development [SeleniumCamp 2017]
Better Bullshit Driven Development [SeleniumCamp 2017]Better Bullshit Driven Development [SeleniumCamp 2017]
Better Bullshit Driven Development [SeleniumCamp 2017]
 

Ähnlich wie How to Mess Up Your Angular UI Components

준비하세요 Angular js 2.0
준비하세요 Angular js 2.0준비하세요 Angular js 2.0
준비하세요 Angular js 2.0Jeado Ko
 
Private slideshow
Private slideshowPrivate slideshow
Private slideshowsblackman
 
Angular js 2.0, ng poznań 20.11
Angular js 2.0, ng poznań 20.11Angular js 2.0, ng poznań 20.11
Angular js 2.0, ng poznań 20.11Kamil Augustynowicz
 
Pengenalan AngularJS
Pengenalan AngularJSPengenalan AngularJS
Pengenalan AngularJSEdi Santoso
 
JSLab. Алексей Волков. "React на практике"
JSLab. Алексей Волков. "React на практике"JSLab. Алексей Волков. "React на практике"
JSLab. Алексей Волков. "React на практике"GeeksLab Odessa
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012ghnash
 
Choosing a Javascript Framework
Choosing a Javascript FrameworkChoosing a Javascript Framework
Choosing a Javascript FrameworkAll Things Open
 
AngularDart Introduction
AngularDart IntroductionAngularDart Introduction
AngularDart IntroductionNikolaus Graf
 
Single Page Applications in Angular (italiano)
Single Page Applications in Angular (italiano)Single Page Applications in Angular (italiano)
Single Page Applications in Angular (italiano)Fabio Biondi
 
Web Components Everywhere
Web Components EverywhereWeb Components Everywhere
Web Components EverywhereIlia Idakiev
 
Building iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" DominoBuilding iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" DominoRob Bontekoe
 
Opencast Admin UI - Introduction to developing using AngularJS
Opencast Admin UI - Introduction to developing using AngularJSOpencast Admin UI - Introduction to developing using AngularJS
Opencast Admin UI - Introduction to developing using AngularJSbuttyx
 
Reactive Type-safe WebComponents
Reactive Type-safe WebComponentsReactive Type-safe WebComponents
Reactive Type-safe WebComponentsMartin Hochel
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCpootsbook
 
An introduction to React.js
An introduction to React.jsAn introduction to React.js
An introduction to React.jsEmanuele DelBono
 

Ähnlich wie How to Mess Up Your Angular UI Components (20)

준비하세요 Angular js 2.0
준비하세요 Angular js 2.0준비하세요 Angular js 2.0
준비하세요 Angular js 2.0
 
Backbone - TDC 2011 Floripa
Backbone - TDC 2011 FloripaBackbone - TDC 2011 Floripa
Backbone - TDC 2011 Floripa
 
Clean Javascript
Clean JavascriptClean Javascript
Clean Javascript
 
Private slideshow
Private slideshowPrivate slideshow
Private slideshow
 
Angular js 2.0, ng poznań 20.11
Angular js 2.0, ng poznań 20.11Angular js 2.0, ng poznań 20.11
Angular js 2.0, ng poznań 20.11
 
Introduction to angular js
Introduction to angular jsIntroduction to angular js
Introduction to angular js
 
Pengenalan AngularJS
Pengenalan AngularJSPengenalan AngularJS
Pengenalan AngularJS
 
Get AngularJS Started!
Get AngularJS Started!Get AngularJS Started!
Get AngularJS Started!
 
JSLab. Алексей Волков. "React на практике"
JSLab. Алексей Волков. "React на практике"JSLab. Алексей Волков. "React на практике"
JSLab. Алексей Волков. "React на практике"
 
Jquery
JqueryJquery
Jquery
 
J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012J query b_dotnet_ug_meet_12_may_2012
J query b_dotnet_ug_meet_12_may_2012
 
Choosing a Javascript Framework
Choosing a Javascript FrameworkChoosing a Javascript Framework
Choosing a Javascript Framework
 
AngularDart Introduction
AngularDart IntroductionAngularDart Introduction
AngularDart Introduction
 
Single Page Applications in Angular (italiano)
Single Page Applications in Angular (italiano)Single Page Applications in Angular (italiano)
Single Page Applications in Angular (italiano)
 
Web Components Everywhere
Web Components EverywhereWeb Components Everywhere
Web Components Everywhere
 
Building iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" DominoBuilding iPhone Web Apps using "classic" Domino
Building iPhone Web Apps using "classic" Domino
 
Opencast Admin UI - Introduction to developing using AngularJS
Opencast Admin UI - Introduction to developing using AngularJSOpencast Admin UI - Introduction to developing using AngularJS
Opencast Admin UI - Introduction to developing using AngularJS
 
Reactive Type-safe WebComponents
Reactive Type-safe WebComponentsReactive Type-safe WebComponents
Reactive Type-safe WebComponents
 
Backbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVCBackbone.js — Introduction to client-side JavaScript MVC
Backbone.js — Introduction to client-side JavaScript MVC
 
An introduction to React.js
An introduction to React.jsAn introduction to React.js
An introduction to React.js
 

Mehr von cagataycivici

PrimeNG - Components para la Vida Real
PrimeNG - Components para la Vida RealPrimeNG - Components para la Vida Real
PrimeNG - Components para la Vida Realcagataycivici
 
PrimeTime JSF with PrimeFaces - Dec 2014
PrimeTime JSF with PrimeFaces - Dec 2014PrimeTime JSF with PrimeFaces - Dec 2014
PrimeTime JSF with PrimeFaces - Dec 2014cagataycivici
 
PrimeFaces User Guide 5.0
PrimeFaces User Guide 5.0PrimeFaces User Guide 5.0
PrimeFaces User Guide 5.0cagataycivici
 
Primefaces Confess 2012
Primefaces Confess 2012Primefaces Confess 2012
Primefaces Confess 2012cagataycivici
 
14 Fr 13 Civici Component Library Showdown
14 Fr 13 Civici Component Library Showdown14 Fr 13 Civici Component Library Showdown
14 Fr 13 Civici Component Library Showdowncagataycivici
 

Mehr von cagataycivici (11)

PrimeNG - Components para la Vida Real
PrimeNG - Components para la Vida RealPrimeNG - Components para la Vida Real
PrimeNG - Components para la Vida Real
 
Itsjustangular
ItsjustangularItsjustangular
Itsjustangular
 
PrimeTime JSF with PrimeFaces - Dec 2014
PrimeTime JSF with PrimeFaces - Dec 2014PrimeTime JSF with PrimeFaces - Dec 2014
PrimeTime JSF with PrimeFaces - Dec 2014
 
PrimeFaces User Guide 5.0
PrimeFaces User Guide 5.0PrimeFaces User Guide 5.0
PrimeFaces User Guide 5.0
 
Primefaces Confess 2012
Primefaces Confess 2012Primefaces Confess 2012
Primefaces Confess 2012
 
Myfacesplanet
MyfacesplanetMyfacesplanet
Myfacesplanet
 
Jsfandsecurity
JsfandsecurityJsfandsecurity
Jsfandsecurity
 
14 Fr 13 Civici Component Library Showdown
14 Fr 13 Civici Component Library Showdown14 Fr 13 Civici Component Library Showdown
14 Fr 13 Civici Component Library Showdown
 
Open Your Source
Open Your SourceOpen Your Source
Open Your Source
 
Facelets
FaceletsFacelets
Facelets
 
Jsfsunum
JsfsunumJsfsunum
Jsfsunum
 

Kürzlich hochgeladen

W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...panagenda
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxComplianceQuest1
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplatePresentation.STUDIO
 
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfAzure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfryanfarris8
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesVictorSzoltysek
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsArshad QA
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerThousandEyes
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionOnePlan Solutions
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVshikhaohhpro
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...OnePlan Solutions
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...kalichargn70th171
 

Kürzlich hochgeladen (20)

W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
W01_panagenda_Navigating-the-Future-with-The-Hitchhikers-Guide-to-Notes-and-D...
 
A Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docxA Secure and Reliable Document Management System is Essential.docx
A Secure and Reliable Document Management System is Essential.docx
 
Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
Microsoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdfMicrosoft AI Transformation Partner Playbook.pdf
Microsoft AI Transformation Partner Playbook.pdf
 
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdfAzure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
Azure_Native_Qumulo_High_Performance_Compute_Benchmarks.pdf
 
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS LiveVip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
Vip Call Girls Noida ➡️ Delhi ➡️ 9999965857 No Advance 24HRS Live
 
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM TechniquesAI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
AI Mastery 201: Elevating Your Workflow with Advanced LLM Techniques
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Software Quality Assurance Interview Questions
Software Quality Assurance Interview QuestionsSoftware Quality Assurance Interview Questions
Software Quality Assurance Interview Questions
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected WorkerHow To Troubleshoot Collaboration Apps for the Modern Connected Worker
How To Troubleshoot Collaboration Apps for the Modern Connected Worker
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
Optimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTVOptimizing AI for immediate response in Smart CCTV
Optimizing AI for immediate response in Smart CCTV
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
Tech Tuesday-Harness the Power of Effective Resource Planning with OnePlan’s ...
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
The Guide to Integrating Generative AI into Unified Continuous Testing Platfo...
 

How to Mess Up Your Angular UI Components