angularjs und typ-d'oh!3

37
ANGULARJS UND TYP-D'OH!3 Christian Herberger

Upload: christian-herberger

Post on 04-Jul-2015

886 views

Category:

Software


0 download

TRANSCRIPT

Page 1: AngularJS und TYP-D'oh!3

ANGULARJS UND TYP-D'OH!3Christian Herberger

Page 2: AngularJS und TYP-D'oh!3

ÜBER MICHIntegratorPHP-EntwicklerFE-Entwickler

Page 3: AngularJS und TYP-D'oh!3

PUNKT.DETYPO3-Komplettpakete in Karlsruhe25 Mitarbeiter

Page 4: AngularJS und TYP-D'oh!3

DER ROTE FADENWas ist AngularJS (und was kann es)? (Live und in Farbe!)Wie kann man AngularJS mit TYPO3 nutzen?StolpersteineAusblick

Page 5: AngularJS und TYP-D'oh!3

ANGULARJS¡Ay, caramba!

Page 6: AngularJS und TYP-D'oh!3

WAS IST ANGULARJS?HTML enhanced for web apps

MVC/MVVMTwoWay/Bidirectional Data BindingDependency InjectionDirektiven als Erweiterung von HTMLTestbarkeit von Grund auf

Die Drei D

Page 7: AngularJS und TYP-D'oh!3

MVC/MVVM

Page 8: AngularJS und TYP-D'oh!3

MVC

Page 9: AngularJS und TYP-D'oh!3

MVVM

Page 10: AngularJS und TYP-D'oh!3

BEISPIEL... kommt gleich

Page 11: AngularJS und TYP-D'oh!3

TWOWAY/BIDIRECTIONAL DATA BINDING

Page 12: AngularJS und TYP-D'oh!3

<script type="text/javascript" src="Resources/JavaScript/angular.js"></script><div ng-app> <input type="text" ng-model="name" placeholder="Bitte Namen eingeben"/><br /> <p>Hallo, ich bin {{name}}</p></div>

Page 13: AngularJS und TYP-D'oh!3

Bitte Namen eingeben

Hallo, ich bin

Page 14: AngularJS und TYP-D'oh!3

A BIT MORE...

<script type="text/javascript" src="Resources/JavaScript/angular.js"></script><script type="text/javascript"> angular.module('displayNameApp', []);

angular.module('displayNameApp').controller('displayNameController', function($scope) $scope.name = 'Apu Nahasapemapetilon'; $scope.resetName = function() { $scope.name = 'Apu Nahasapemapetilon'; }; });</script><div ng-app="displayNameApp"> <div ng-controller="displayNameController"> <input type="text" ng-model="name" placeholder="Bitte Namen eingeben"/><br /> <p>Hallo, ich bin {{name}}</p> <input type="button" ng-click="resetName()"> </div></div>

Page 15: AngularJS und TYP-D'oh!3

Apu Nahasapemapetilon

Hallo, ich bin Apu Nahasapemapetilon

Reset Name

Page 16: AngularJS und TYP-D'oh!3

WEITERE MÖGLICHKEITENng-repeat für Ausgabe von Arraysselect mit ng-optionsng-init als KonstruktorVerschachtelte Controller mit Vererbung

Page 17: AngularJS und TYP-D'oh!3

DEPENDENCY INJECTION

Page 18: AngularJS und TYP-D'oh!3

WAS IST DI?Benötigt ein Objekt ein anderes Objekt als Abhängingkeit, zieht es

ein zentral abgelegtes Objekt ab und muss es nicht selbsterstellen

Fuktioniert bei allen "Factories" (Modulen, Controllern,Direktiven, Services, ...)

Page 19: AngularJS und TYP-D'oh!3

BEISPIEL

<script type="text/javascript"> angular.module('displayNameApp', ['fremdModul']);

angular.module('displayNameApp').controller('displayNameController', function($scope, $http, eigenerService) { $scope.name = 'Apu Nahasapemapetilon'; $scope.resetName = function() { $scope.name = $http.get(...); var blubb = eigenerService.doSomething(); }; });

angular.module('displayNameApp').factory('eigenerService', function($http) { return { doSomething = function() {...}; }; });</script>

Page 20: AngularJS und TYP-D'oh!3

DI VERÄNDERNAngular bietet einen injector mit Funktionen wie get()Abhängig von Conditions, oder jedem eingenen Code, andereDependencies einspielen

Page 21: AngularJS und TYP-D'oh!3

BEISPIEL

<script type="text/javascript"> angular.module('displayNameApp', []); angular.module('displayNameApp').controller('displayNameController', function($scope, $http) {

if ($scope.testMode) { $http = angular.injector.get('myHttpMock'); }

$scope.name = 'Apu Nahasapemapetilon'; $scope.resetName = function() { $scope.name = $http.get(...); }; });</script>

Page 22: AngularJS und TYP-D'oh!3

DIREKTIVEN ALS ERWEITERUNG VON HTML

Page 23: AngularJS und TYP-D'oh!3

WÄR DAS NICHT GENIAL?

<name-list last-name="Simpson"></name-list>

OUTPUT:Homer SimpsonMarge SimpsonBart SimpsonLisa SimpsonMaggie Simpson

Page 24: AngularJS und TYP-D'oh!3

ES IST SO GENIAL!

Page 25: AngularJS und TYP-D'oh!3

DAS "NORMALE" JAVASCRIPT

<script type="text/javascript"> angular.module('displayNameApp', []);

angular.module('displayNameApp').directive('nameList', function($http) { return { scope: { lastName: '@lastName' }, restrict: 'E', templateUrl: 'nameList.html', link: function(scope) { $http.get(/* ajax call with last name */) .success(function(resonseData) { scope.nameList = responseData.nameList; }); } } });</script>

Page 26: AngularJS und TYP-D'oh!3

DAS "TEMPLATE"

<div> <script type="text/ng-template" id="nameList.html"> <div> <ul> <li ng-repeat="name in nameList">{{name}} {{lastName}}</li> </ul> </div> </script> <name-list last-name="Simpson"></name-list></div>

Page 27: AngularJS und TYP-D'oh!3

BEISPIEL... gibt's hier keins - nicht relevant für unsere Anwendung

Page 28: AngularJS und TYP-D'oh!3

TESTBARKEIT

Page 29: AngularJS und TYP-D'oh!3

UNIT TESTSGute Integration in aktuelle Testframeworks (Karma, Jasmine)Durch DI einfach Code-Einheiten zu isolierenJeder Service, Controller, ... kann einzeln losgelöst aufgerufenwerdenIn der Doku gibt es Test-Doku für jede Variante

Page 30: AngularJS und TYP-D'oh!3

"END TO END"-TESTungefähr wie Oberflächentest - Aufruf der Funktion, Vergleichdes Outputs mit definierten Mocksangular-mock als Modul für fertige MocksIntegration von HTML-Template-Tools in Karma/JasmineJS-Tests laufen auf Browsern -> Reale Bedingungen

Page 31: AngularJS und TYP-D'oh!3

INTEGRATION IN TYPO3

Page 32: AngularJS und TYP-D'oh!3

IDEENEine Action für die App (=> SinglePage App)Action komplett Cachebar machenModels mit $exposedProperties und getExposedProperties()anreichernObjectToJson-Parser nutzen, JSON an ng-init-AufrufeübergebenFluid nutzen!Angular-Templates als Partials -> Ordnung, Fluid ;)Kommunikation mit TYPO3 über AJAX und eIDZugriffsrechte auf die Seite und das Plugin mit der App

Page 33: AngularJS und TYP-D'oh!3

STOLPERSTEINE

Page 34: AngularJS und TYP-D'oh!3

STOLPERSTEINEFluid + JSON = 'Array' -> <![CDATA[ nutzen!array('name' => 'value') wird in JSON ein Objekt und damitnicht sortierbarJavaScript ist eine asnychron arbeitende SpracheAnderes JavaScript kann die App stören, Ladezeit verlängernusw. -> Möglichst losgelöst einbinden

Page 35: AngularJS und TYP-D'oh!3

AUSBLICK

Page 36: AngularJS und TYP-D'oh!3

Fragen? Antworten! Diskussion?

Page 37: AngularJS und TYP-D'oh!3

Vielen Dank für die Aufmerksamkeit!