ANGULAR 1 TIPS FROM THE TRENCHES

Storlek: px
Starta visningen från sidan:

Download "ANGULAR 1 TIPS FROM THE TRENCHES"

Transkript

1 Novatrox Group ANGULAR 1 TIPS FROM THE TRENCHES Chris Klug

2 Innehållsförteckning Introduktion... 3 Undvik Angular... 4 In-line är av ondo... 4 MyController.js... 5 Module.js... 5 Undvik $scope så mycket som bara möjligt... 5 Använd pub/sub istället för $broadcast och $emit... 6 Undvik $scope i controllers genom att flytta beroendet en nivå... 7 MyController.js... 8 MyControllerDirective.js... 8 Module.js... 9 Index.html... 9 Dölj $http, och skapa en fasad som är lättare att arbeta med... 9 Använd Providers and Configuration istället för inbyggda antaganden Använd TypeScript JavaScript moduler App.js Index.htm Om författaren Augusti

3 Angular 1 Tips from the trenches Introduktion Angular är ett av världens mest användas SPA ramverk, och trots dess fel och brister så har det plockats upp av en stor del av web-utvecklings-communityn, och använts för att bygga oändligt många stora och små lösningar. Det är ett ramverk som kommer med det mesta man behöver i lådan, och som gör utvecklarna produktiva snabbt. Angular är även ett lätt ramverk att lära sig att arbeta med. Det finns massor av bra, och dåliga, tutorials på nätet som visar hur man kan komma igång med Angular. Problemet är dock just det, de visar hur man kommer igång, och ibland till och med hur man kommer igång på fel sätt. Vill man gå vidare efter det är resurserna färre, och de tenderar att fokusera på att visa upp en, eller möjligen två, saker som man bör tänka på. Men i mångt och mycket måste man bli ordentligt insatt innan man kan hitta bra information om hur man utvecklar Angular applikationer som är robusta, möjliga att bygga vidare på och underhållsbara. I det här dokumentet har vi på Novatrox samlat tips, idéer och tankar kring Angular-utveckling som vi samlat på oss under de senaste åren. Alla med fokuset att bygga bättre applikationer. Vi undviker dock gärna att kalla dem för Best Practices eftersom de flesta saker tenderar att vara bra under vissa omständigheter, men inte andra. Och Best Practices Under Some Circumstances låter lite omständligt Augusti

4 Undvik Angular En grundpelare i alla de tipsen och tankarna du kommer hitta i detta dokument är att försöka undvika Angular i så hög grad som möjligt. Då menar jag inte att man ska välja ett annat ramverk, utan att man ska försöka bygga sina egna delar med så lite kopplingar som möjligt till Angular. Genom att bygga komponenter som inte är beroende av Angular i sig gör det lättare att göra en hel del saker. Det blir bland annat lättare att testa koden. Det blir lättare att byta ut Angular i framtiden om det skulle behövas. Och det blir lättare för någon som inte kan Angulars lite mer komplexa delar att sätta sig in i koden, och kanske till och med hjälpa till med utvecklingen. Så det finns många anledningar att bygga sina komponenter Angular-agnostiska så långt det går. Att bygga komponenter som är Angular-agnostiska innebär dock inte att vi ska ignorera Angular. Det innebär bara att de delar som är beroende av Angular blir mindre, och agerar mer som ett lim mellan den agnostiska koden, och den som känner till Angular. Det intressanta är dock att det behövs djupare kunskap om Angular för att bygga agnostiska komponenter, än det behövs för att bygga saker som är hårt kopplade till Angular. Så med Undvik Angular så menar jag att man ska undvika Angular där det går, och omfamna Angular där det behövs. In-line är av ondo Detta är något de flesta förstår relativt snabbt när man börjar med Angular, men det är ändå tyvärr så att man in-line är vanligt förekommande när man tittar på tutorials på nätet. Så vad menar jag då med in-line? In-line kod i Angular är när man bygger sina komponenter (controllers, directives etc) som in-line funktioner. Ex: angular.module( MyModule, []).controller( MyController, function($scope) { $scope.greeting = Hello World ; ); Den kursiva koden i detta exempel är en in-line funktion. Man skapar en funktion in-line med resten av koden. Controllern i det här fallet registreras i Angular snabbt och enkelt, och man är igång och skapar nytta omedelbart, vilket i sig är bra. Problemet är att man har byggt in sig i Angular helt och hållet. Det finns inget sätt att komma åt den funktionen utan att bootstrappa Angular och be Angular om en instans av den funktionen. Detta gör bland annat koden mycket svårare att testa, svårare att läsa och ställer dessutom en del extra krav på ordningen de olika JavaScript filerna läses in. Vill man till exempel ha flera komponenter i samma modul, så måste man antingen registrera modulen först i en fil, och sen Augusti

5 registrera komponenterna i andra filer som laddas in efteråt. Detta innebär att koden inte bara är hårt knuten till Angular, den ställer även krav på kontextet som den laddas i genom att den är hårt knuten till kod i andra filer. En bättre lösning är att separera controller-koden från registreringen i Angular enligt: MyController.js function MyController($scope) { $scope.greeting = Hello World ; Module.js angular.module( MyModule, []).controller( MyController, MyController); Detta skapar fortfarande en koppling mellan filerna i form av att Module.js förväntar sig att MyController.js redan laddats, men i gengäld så är nu MyController inte beroende av Angular i nån högre utsträckning. Även om MyController använder en variabel som heter $scope, så kan jag nu skapa upp en ny instans och skicka in ett mockat Scope objekt om jag vill. I det här fallet skulle $scope kunna vara vilket JavaScript objekt som helst. Har vi sedan flera komponenter som skall registreras så kan de laddas in i vilken ordning som helst, så länge Module.js laddas in sist, och ser till att registrera dem i Angular. Undvik $scope så mycket som bara möjligt Sedan Angular 1.2 har man försökt pusha utvecklare att använda den så kallade ControllerAs syntaxen. Detta innebär att man deklarerar sin controller med följande syntax <... data-ng-controller= MyController as ctrl >{{ctrl.greeting</...> Detta gör att Angular sätter upp Scope/Controller förhållandet lite annorlunda. Istället för att instansiera controllern och ge den en referens till $scope, och sedan låta controllern sätta egenskaper på Scope objektet, så skapar Angular istället en instans av controllern, och sätter sedan den instansen som en egenskap på scopet. På detta vis skapar man databindningar mot den faktiska controllern, och inte direkt mot scopet. Genom att ange as ctrl så säger man till Angular att man vill skapa upp en controller och sätta egenskapen ctrl på scopet till den instansen. Sedan sätter man upp alla sina bindningar till att binda mot den instansen istället för scopet. Augusti

6 Scopet är fortfarande ansvarigt för den faktiska bindingen, men det märks mycket mindre. Controllern kan nu ofta undvika att ta in $scope i de flesta fall, och på så vis blir mer eller mindre helt Angular agnostisk. Med exemplet ovan skulle nu controllern se ut så här istället function MyController() { this.greeting = Hello World ; och databindingen skulle se ut så här <div data-ng-controller= MyController as ctrl ><h1>{{ctrl.greeting</h1></div> Detta gör det ännu enklare för oss att testa vår controller. Nu tar den ju inte ens ett $scope objekt som vi behöver mocka. Och även om det är lätt att mocka det i det här fallet, så är det ännu lättare att inte behöva göra nått alls. Dessutom kan man nu teoretiskt sätt använda controllern helt utan Angular om man vill. På alla platser där man definierar en controller i Angular så kan man nu ange controller as, och man bör definitivt göra det. Använd pub/sub istället för $broadcast och $emit Om man har flera komponenter som behöver kommunicera med varandra i Angular, så är den uppenbara lösningen att skicka meddelanden upp och ned i scope hierarkin med hjälp av $broadcast och $emit. En uppenbar lösning som ofta leder till problem, eller fula lösningar. Idén med att kommunicera mellan controllers är bra, och nödvändig i många situationer. Problemen med att göra det med hjälp av $broadcast och $emit är tyvärr ett par. Först och främst bygger det på att vi vet vilka scope som finns ovanför eller under det nuvarande scopet. Detta gör att vi kopplar oss en del till hur vi kan sätta upp våra scopes, dvs vilka controllers och directives som kan användas var. Sen måste vi veta om vi vill skicka meddelandet uppåt eller neråt. Vi kan inte skicka till syskon, utan bara till föräldrar eller till barn. Vill man publicera till syskon så måste man antingen skicka meddelanden uppåt till en förälder med hjälp av $emit, för att sedan i föräldern skicka samma meddelande nedåt till barnen med $broadscast. Något som kopplar oss ännu hårdare till ordningen på scopen som används. Alternativt kan vi ta en referens till rot-scopet och använda det för att $emit:a meddelanden till alla scope i hela vyn. Något som har en del uppenbara prestandaproblem. Augusti

7 Till sist måste vi även ha en referens till $scope för att kunna använda $broadcast och $emit. Något som jag precis skrev att vi skulle undvika så mycket som möjligt. Lösningen är dock inte direkt komplicerad som tur är. Det lättaste sättet är att införskaffa ett pub/sub ramverk och sedan kapsla in den funktionaliteten i en Angular service. Detta gör att våra komponenter har ett beroende mot en komponent som vi själva skapat, och som bör vara lätt att mocka om det behövs. Det innebär också att man kan skicka meddelanden åt alla håll och kanter på ett enkelt sätt. Skicka till föräldrar? Inga problem. Barn? Inga problem! Syskon? Självklart! Till sist innebär det också att vi har ännu ett verktyg vi kan använda för att slippa ta ett beroende mot en Angular-feature. I de flesta projekt hittills har jag kapslat in Postal.js i en enkel MessagingService som erbjuder två metoder, en subscribe och en publish. Subscribe returnerar ett objekt som kan användas att unsubscribea. En modell som är identisk till den som Postal.js använder sig av, fast inkapslad i ett par egna funktioner för att inte läcka Postal-specifik funktionalitet. Undvik $scope i controllers genom att flytta beroendet en nivå Det finns viss funktionalitet i $scope som vi ibland inte kan komma ifrån. Framförallt är det en fråga om $watch. Vi är rätt ofta beroende av denna funktionalitet för att utföra det vi behöver, och det finns tyvärr få bra sätt att bevaka värden utan $watch. Man kan använda getters och setters i vissa fall, men i vissa fall räcker inte det. $watch innebär ju dessutom att vi i de flesta fall behöver använda $on också för att kunna koppla bort vår watch när scopet förstörs. Så oftast får vi kod som ser ut ungefär så här function MyController($scope) { var watch = $scope.$watch( myprop, function(newval, oldval) { ); $scope.$on( $destroy, function() { watch(); ); Den här koden gör uppenbart saker som behövs, men som kopplar controller till $scope och Angular. Det är dessutom inte helt trivial kod som behöver skrivas för att mocka bort $scope i det här fallet om vi vill kunna skriva tester. För att inte tala om att vi måste veta om hur $scope används för att mocka rätt delar eftersom vi inte vill mocka hela objektet i onödan. Augusti

8 En lösning på detta är att bygga controllern helt Angular agnostisk, vilket vi gärna vill, och sen skapa ett directive som hanterar skapandet av controllern och hanteringen av de $scope specifika sakerna. Ett directive har redan en hård koppling mot Angular, så det gör inget om vi tar beroenden på $scope i ett directive. Så att använda detta för att slippa Angular beorendet i controllern är en bra lösning. Så hur fungerar det då? Enkelt sett så skapar vi ett nytt directive för varje controller som behöver denna funktionalitet. Det ser ut ungefär så här MyController.js function MyController() { this.onvaluechanged = function(newvalue) { // Handle change! this.value = ; MyControllerDirective.js function MyControllerDirective($injector) { return { scope: true, link: function(scope, element, attrs, controller) { var ctrl = $injector.instantiate(mycontroller, { $scope: scope ); scope[attrs.mycontroller] = ctrl; var watch = scope.$watch(function() { return ctrl.value;, function(newval, oldval) { ctrl.onvaluechanged(newval); ); scope.$on("$destroy", function() { watch(); ); Augusti

9 Module.js angular.module( MyModule, []).directive( mycontroller, MyControllerDirective); Index.html <div data-my-controller= ctrl > <input type="text" data-ng-model="ctrl.value" /> </div> Ok, det är ju rätt mycket kod, men det mesta är rätt självförklarande hoppas jag. Man skapar en controller som inte tar ett beroende på $scope för att bevaka en egenskap. Istället så exponerar man en funktion för att hantera att något ändrats. I detta fallet onvaluechanged(). Sedan skapar man ett directive som har till uppgift att skapa upp controllern, sätta den som en egenskap på scope objektet precis som med controller as, och till sist hantera $watch och $scope, och anropa funktionen på controllern när värdet ändras. Till sist registrerar man bara directivet i Angular, eftersom det inte finns något behov för Angular att ens känna till controllern eftersom den skapas upp av directivet. Användning blir lite förändrad i form av att man inte använder ngcontroller, istället använder man sitt eget directive för att sätta upp controllern. Så istället för data-ng-controller=... så skriver man nått i stil med data-my-controller= ctrl, beroende på vad för namn man registrerat sitt directive under. Fördelen med detta är än en gång att koppla loss controllern från Angular. Det blir lite mer kod, men och andra sidan så blir den intressanta koden, dvs, controllern, enklare att förstå och smidigare att jobba med. Det är dessutom mer likt den modell som Angular 2 arbetar enligt med sina components. Angular 1.5 har även introducerat components i Angular 1, vilket kan vara intressant om man ser en potentiell flytt till 2:an i framtiden. Men det är av förklarliga skäl inte en exakt kopia av det som kommer i 2:an, men är trots det intressant att överväga. Dölj $http, och skapa en fasad som är lättare att arbeta med De flesta Angular-baserade applikationerna i världen anropar tjänster på nätet för att hämta, eller lämna/uppdatera information. Det lättaste sättet är att helt enkelt bara ta in en instans av $http och använda den för att göra anropen. Detta introducerar dock ett gäng intressanta problem. Först och främst så kopplar vi oss en än gång hårt mot Angular genom att ta ett beroende på $http hela vägen uppe i controllern. Sen leder det tilll att vi sprider ut URL:er/paths i våra controllers. Något som kan verka som ett litet problem, tills man behöver uppdatera några av dem och inte riktigt vet var de används nånstans. Augusti

10 Det innebär också att det inte finns någon direkt central plats att lägga in felhantering. Det går att göra detta genom inbyggd funtionalitet i Angular, men det innebär ju att vi bygger in en relativt central del av vår applikation (felhantering och loggning) i Angular. Något som kanske inte är jättebra i alla fall. Till sist är det även svårare att hantera autentisering när man sprider ut $http anropen på olika platser i koden. I SPA-applikationer tenderar vi att använda bearer tokens för autentisering, vilket innebär att alla anrop som görs måste få en autentiserings header satt innan man skickar iväg det. Att ha denna logik, inkl logik för att hantera potentiell utloggning, utspridd i hela applikationen är inte speciellt önskvärt. Lösningen kring detta är att skapa ett, eller kanske två lager emellan controllern och $http. Den enklaste lösningen, dvs ett lager, innebär att man kapslar in $http i en mer specifik service. På så vis ligger alla anropen till en specifik endpoint på ett ställe, och likaså loggning, felhantering och hantering av eventuell utloggning. Till exempel skapar man en ProductService om man behöver produkt information från en tjänst. ProductService:n kapslar sedan in själva anropet till servern med allt vad det innebär, och exponerar istället en enkel funktion som förklarar för konsumenten vilka parametrar som behövs. function ProductService($http) { this.searchproduct = function(query) { return $http.get(" + encodeuri(query)).then(function(response) { return response.data;, function(error) { // Handle error ) För controller innebär det att man istället för att behöva ha URLer och http konfiguration själv, så tar man ett beroende på ProductService och får ett enkelt API att arbeta med, dvs färdiga funktioner för det man kan göra. function ProductController(productService) { this.onsearchclick = function() { productservice.searchproduct(this.query).then(function(products) { // Handle result ) Augusti

11 this.query = ; Denna lösning har många fördelar jämfört med att ta in $http i controller. Men den har också en del nackdelar jämfört med att introducera ett lager till. Genom att bara ha ett lager som i den här lösningen, så sprider vi fortfarande ut felhantering, loggning, autentisering etc i ett antal olika services. Något som är bättre att hantera på ett enda ställe. Så, istället för att ProductService nivån tar ett beroende på $http, så introducerar man en egen HttpService, vilken ProductService i sin tur tar ett beroende på. HttpServicen erbjuder grundläggande HTTP funktionalitet, dvs get, put, post etc, men kapslar in $http och står för felhantering, loggning och autentisering. Det skulle kunna se ut i stil med det här function HttpService($http, authservice) { this.get = function(path) { var config = { method: GET, url: path ; if (authservice.userisauthenticated) { config.headers = { Authorization: 'Bearer ' + authservice.accesstoken ; return $http (config).then(function(response) { return response.data;, function(error) { // Log // Handle Unauthorized return getstandardizederrorresult(error); ) Som synes så tar HttpService ett beroende på $http, och kapslar in anropet till denna service. I den inkapsling så hanteras även loggning och felhantering, samt autentisering. I det här fallet används en fiktiv service som heter authservice, som hanterar huruvida användaren är inloggad, samt dess access token. Augusti

12 Detta är självklart en förenkling av vad man bör bygga, men den visar förhoppningsvis vad målet med denna abstraktion är. Väljer man dessutom att hantera promises manuellt med $q, så kan man erbjuda funktionalitet som återinloggning vid utloggning utan att man förlorar data som skulle ha postats till servern etc. Något som är väldigt svårt att göra på ett strukturerat sätt utan en HTTP abstraktion som denna. Använd Providers and Configuration istället för inbyggda antaganden De flesta lösningar man bygger kommer att befinna sig i olika miljöer under sin livstid. De kommer leva i en utvecklingsmiljö, en testmiljö, en produktionsmiljö etc. Alla dessa miljöer har troligen olika konfiguration. Kanske kör servicarna man är beroende av på lokalt på en annan port i utvecklingsmiljön, på en intern server i test och på en publik server i produktion. Något vi måste ta hänsyn till. Miljöer är bara en sak som förändras när vår kod används i olika scenarion. Kanske är en del av konfigurationen användarbaserad? Kanske vill vi kunna tända och släcka features med featuretoggles? Lösningen är att inte bygga in logik i koden för att automatiskt byta inställningar. Logik som om hosten är localhost, använd endpoint X etc. Använd istället providers och konfigurera servicarna som används istället. Konfigurationen kan antingen komma genom ett anrop till en konfigurations endpoint när applikationen startar upp, eller så kan konfigurationen finnas i sidan. Eller kanske en kombination. När jag säger att konfigurationen finns i sidan, så menar jag att man renderar konfigurationen i ett script-block i HTML sidan enligt: <script src=... ></script> <script> var appconfig = { servicebaseurl: ; </script> <script src=.../mymodule.js ></script> Den här appconfig variabeln kan sen kommas åt och användas för service configuration i Angular modulernas config steg. Så här angular.module( MyModule, [])....config(httpserviceprovider) { Augusti

13 httpserviceprovider.setbaseurl(appconfig.servicebaseurl); Det går även att komma åt appconfig i all annan kod, men undvik detta. Det är illa nog att config funktionen förutsätter att det finns en magisk variabel. Att sprida ut det beroendet är inte bra. Alternativt kan man även skapa en standard konfiguration som man avviker ifrån med hjälp av Angular s extend funktion. angular.module( MyModule, [])....config(httpserviceprovider) { var defaultconfig = { servicebaseurl: /api/, myotherconfig: configvalue var config = angular.extend(defaultconfig, appconfig {); httpserviceprovider.setbaseurl(config.servicebaseurl); På det här sättet så har man alltid värden satta till nått standardvärde, men möjligheten att skriva över dem med en annan konfiguration vid behov. Ibland kan det till och med vara vettigt att bygga in config för att skapa en fördröjning i HttpServicen. Genom att göra det, så kan vi se hur applikationen kommer att uppföra sig i produktion där det finns latency, istället för att bara se hur applikationen fungerar i utvecklingsmiljön där anropen till servern är mer eller mindre försumbara. Använd TypeScript TypeScript är ett superset till JavaScript, som transpileras till JavaScript. Det ger oss tillgång till features som JavaScript inte erbjuder, samt features som JavaScript kommer erbjuda i framtiden, men som webläsarna ännu inte hunnit implementera. Bland annat ger TypeScript stöd för statisk typning. Något som kan hjälpa till på ett flertal sätt. För det första ser det till att vi inte försöka använda fel typer när vi anropar funktioner. Det ser även till att vi inte skickar in för många, eller för få variabler till constructors och funktioner. Till sist möjliggör det även bättre verktygsstöd. Genom statisk typning, så kan verktygen helt plötsligt ge utvecklaren en massa stöd som tidigare inte varit möjligt pga JavaScripts lösa typning. Vi kan få IntelliSense funktionalitet som faktiskt fungerar. Refactoring stöd. Go To funktionalitet. Och en massa annat. Augusti

14 TypeScript ger oss även stöd för klasser och interface, vilket kan underlätta och strukturera koden för oss. Samtidigt är det JavaScript-kompatibelt, så om man behöver JavaScripts lösa typning, eller funktionella funktionalitet, så är det fritt fram att använda den i TypeScript också. Så TypeScript ger oss det bästa av både de statisk typade och löst typade världarna. Det är upp till oss att välja vilka delar vi vill använda var. JavaScript moduler JavaScript erbjuder möjligheten att använda moduler, något som kan underlätta massor. I ES2015 lanserades idén att använda export/import i filer för att på så vis göra en fil till en modul. Andra moduler kan sedan deklarera ett beroende på en annan modul, dvs filer kan deklarera andra filer som de är beroende på. Så istället för att alltid behöva se till att alla filer laddas in i rätt ordning på sidan, så kan man automatisera processen genom att titta på vilka moduler man behöver ladda in, och i vilken ordning de behöver laddas in. TypeScript stödjer även det moduler på detta vis. Problemet är att detta är en ES2015 feature, vilket gör att det inte stöds natively av webläsarna som finns ute idag. Det är även så att utvecklare tidigare sett detta behov, och utvecklat egna lösningar för modulär laddning. Så det finns ett antal olika modulsystem på marknaden. Något man behöver ta i beaktande när man väljer bibliotek och ramverk att arbeta med. Antingen så låter man ett verktyg bundla ihop alla filerna till en stor fil på servern och serverar den till klienten, vilket är bra i produktion, eller så använder man ett JavaScript-bibliotek i webläsaren som kan ladda filerna asynkront för oss, vilket är bra under utveckling. Eller, så gör man det ena under utveckling, dvs använder individuella filer och ett bibliotek för att ladda dem, och det andra i produktion. Exempel på verktyg för att bundla moduler är WebPack och Browserify, och för dynamisk laddning av filer i webläsaren kan man använda System.js. Alla dessa tenderar att kunna hantera alla de olika modultyperna. Vettigt att känna till är även system.js-builder, som är ett verktyg för att bundla moduler med hjälp av samma logik som System.js gör i webläsaren. Modulärladdning av moduler gör saker mycket enklare. Det är lätt att råka glömma en fil som skall in i HTML-sidan, eller inkludera filer i fel ordning. Moduler löser detta utan problem. Dessutom gör det att det blir lätt att blanda lösa filer under utveckling, och bundlade och minifierade filer i produktion. Det är dock bra att veta att om man väljer att använda moduler på detta vis, och inte använder bundling, utan laddar de individuella filerna asynkront, så kan man inte bootstrappa Angular som vanligt. Istället måste man vänta tills alla filer laddats ner, och sedan exekvera bootstrappningen manuellt. Augusti

15 Om man har en fil som heter app.js som entry point, dvs som första fil att be om från servern, så skulle den kunna se ut så här. App.js import { AppDirective from './appdirective'; angular.module("mymodule", []).directive("myapp", AppDirective); angular.element(document).ready(() => { angular.bootstrap(document, [MyModule]); ); Index.htm <div data-my-app></div> <script src="scripts/libs/system.js"></script> <script> System.config({ ); System.import('app.js'); </script> Det här exemplet använder ES2015 moduler med import/export syntax. Det behöver transpileras till lämplig ES5 syntax för att fungera i en webläsare, men det är lättare att visa det så här. Html sidan har lite kod som konfigurerar System.js för att det biblioteket ska förstå vad det ska göra. Därefter så ombeds System.js att importera app.js. System.js ser då att app.js har ett beroende på appdirective.js, och laddar ner den filen. Sen anges det som en del av System.js konfigurationen att app.js har ett beroende till Angular också, så System.js laddar ner Angular också. När alla de filerna är nerladdade, så laddas appdirective.js in i webläsaren, sedan Angular, och till sist app.js. Allt baserat på hur de olika modulerna har beroenden till varandra. Problemet med detta är att när Angular laddas in, så kommer det att försöka bootstrappa MyModule om det finns ett ng-app attribut. Problemet med det är att MyModule är definierat i app.js som ännu inte laddats in i webläsaren. Så det går inte. Så istället för att använda ngapp direktivet för att bootstrappa Angular, så låter vi app.js innehålla koden för att göra det. Och det är koden som ser ut så här angular.element(document).ready(() => { angular.bootstrap(document, [MyModule]); ); Först använder vi Angular för att få tag i document elementet. Sen säger vi att när document är färdigladdat, vilket det redan bör vara, så vill vi exekvera angular.bootstrap, och bootstrappa Augusti

16 document elementet med modulen MyModule. Denna processen kommer då gå igenom DOMen och hantera alla Angular attribut som väntat. Om författaren Chris Klug är Technical Dude på Novatrox Consulting med bland annat femton års erfarenhet av arkitektur, systemutveckling och Azurespecifik arkitektur. Han är en omtyckt lärare, mentor och talare vid konferenser runtom i världen, nu senaste [augusti 2016] i Sydney (Australien) och Redmond (USA). Chris har dessutom de senaste fem åren erhållit status som Microsoft MVP inom ASP.NET samt som Microsoft Azure insider. Augusti

17 Novatrox Group Till följd av en allt mer föränderlig värld med snabbare processer gör sig behovet av struktur, informationsförsörjning och automatisering gällande. Skillnaden mellan att kunna möta marknadens behov eller att totalt misslyckas beror på förmågan att kunna förhålla sig till dessa snabba förändringar i en digital värld. Novatrox Group tillhandahåller resurser inom våra områden Verksamhetsutveckling, Arkitektur, Systemutveckling samt Ledning & Styrning. Vi levererar både resurskonsulter samt tar oss an kortare eller längre helhetsåtaganden gentemot våra kunder. Arkitektur Inom arkitektur är Novatrox ett av Stockholms större företag med ett tiotal arkitekter. Vi hjälper organisationer att få ut mer från sina investeringar genom att stötta med struktur, erfarenhet och mentorskap. Vi tillhandahåller tjänster inom analys och utredning, arkitekturgranskningar, arkitekturstyrning samt stöd vid strukturförflyttningar. Verksamhetsutveckling Novatrox konsulter består av ett exklusivt team med unik spetskompetens och track-record inom förändringsledning och agil verksamhets- utveckling. Vi tillhandahåller tjänster inom affärs- och verksamhetsutveckling, förändringsledning och processutveckling. Vi arbetar också med problemlösning för att få upp projekt eller team på banan igen. Ledning & Styrning Novatrox ledningsteam säkerställer att projektens effekthemtagningar förverkligas. Teamet är certifierat i projektmetodiker och agila metoder. Vi tillhandahåller tjänster inom projekt-, test- och förvaltningsledning. Vidare kan vi stötta med releasehantering samt driva och införa projektkontor. Systemutveckling Novatrox är specialister inom.net-platformen och frontendutveckling med erfarenhet av molnlösningar, utbildning och coaching av team. Till våra kunder tillhandahåller vi tjänster såsom föreläsningar, utbildningar, coaching, mjukvaruarkitektur samt systemutveckling. Bland Novatrox konsulter finns Microsoft MVP er, Azure Insiders. Vi har välkända talare vid konferenser runtom i världen. Augusti

18 Novatrox Group Om Novatrox Group Novatrox Group är ett svenskt Stockholmsbaserat IT- och managementkonsultföretag baserat i Stockholm. tillhandahåller resurser inom kompetensområdena Verksamhetsutveckling, IT- Arkitektur, Systemutveckling samt Ledning & Styrning. Vi levererar både resurskonsulter samt tar oss an kortare eller längre helhetsåtaganden gentemot våra kunder. Våra kunder återfinns idag bland både små och stora organisationer samt offentlig verksamhet. Christer Ogenstad Charlotte Grip VD Säljchef christer.ogenstad@novatrox.se charlotte.grip@novatrox.se Augusti

FRÅN NYUTVECKLINGS- PROJEKT TILL EFFEKTIV IT-FÖRVALTNING

FRÅN NYUTVECKLINGS- PROJEKT TILL EFFEKTIV IT-FÖRVALTNING Novatrox Group FRÅN NYUTVECKLINGS- PROJEKT TILL EFFEKTIV IT-FÖRVALTNING Lia Holmqvist Anna Edelönn Från nyutvecklingsprojekt till effektiv IT-förvaltning Från förälskelsefas till vardagsharmoni - lyckat

Läs mer

Webbutveckling med AngularJS

Webbutveckling med AngularJS Webbutveckling med AngularJS Kommunikation och Användargränssnitt HT 2016 Per Lind Upplägg Laboration 1 - Skapa en SPA (single-page application) med AngularJS Laboration 2 - Responsiv design, mobile-first

Läs mer

<script src= "http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js"></script>

<script src= http://ajax.googleapis.com/ajax/libs/angularjs/1.3.14/angular.min.js></script> AngularJS Skriven av: Isak Glans. Datum: 2015-04-29. Kurs: Webbutveckling. Lärare: Per Sahlin. Utbildning: Systemutvecklare i.net, Newtons Yrkeshögskola. 1 Sammanfattning Syftet med denna uppsats är att

Läs mer

INTRODUKTION TILL ANGULAR JS

INTRODUKTION TILL ANGULAR JS INTRODUKTION TILL ANGULAR JS DEL 1 Mahmud Al Hakim www.alhakim.se mahmud@alhakim.se VAD ÄR ANGULAR? Angular är ett JavaScript ramverk. Angular används för utveckling av frontendwebbapplikationer. Angular

Läs mer

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer.

Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer. Informationsinfrastruktur 7.5 hp Mattias Nordlindh Inledning Det här dokumentet är till för att ge en översikt över ASP.NET MVC samt hur WCF Services används från.net applikationer. Dokumentet består av

Läs mer

JAVASCRIPT. Beteende

JAVASCRIPT. Beteende JAVASCRIPT Beteende OVERVIEW HTML Formulär JavaScript Syntax Events DOM Validering av fomulär WEBBPROGRAMMERING PÅ KLIENTSIDAN Skriptspråk som körs på klientsidan (klientskript) Koden exekveras i webbläsaren

Läs mer

Design av interaktiv multimedia. Läs i förväg om det som övningarna kommer att beröra. Träna hemma både före och efter övningarna.

Design av interaktiv multimedia. Läs i förväg om det som övningarna kommer att beröra. Träna hemma både före och efter övningarna. Använd olika lager. Döp lagren! Organisera era bibliotek! Design av interaktiv multimedia Ge era symboler instansnamn för att hitta dem med AS. Nytt för denna kurs: Ingen ActionScript-kod i.fla-filen!

Läs mer

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder Introduktion TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder OO är den mest använda programmeringsparadigmen idag, viktigt steg att lära sig och använda OO. Klasser är byggstenen i

Läs mer

TUTORIAL: KLASSER & OBJEKT

TUTORIAL: KLASSER & OBJEKT TUTORIAL: KLASSER & OBJEKT I denna tutorial lär vi oss att använda klasser och objekt samt hur vi bygger en enkel applikation kring dessa. I tutorialen kommer det finnas en mängd kod som du antingen kan

Läs mer

Appar med ryggrad. Introduktion till JavaScriptramverket Backbone

Appar med ryggrad. Introduktion till JavaScriptramverket Backbone Appar med ryggrad Introduktion till JavaScriptramverket Backbone Vanlig webbsida Databas MVC - Model View Controller MVC - Model View Controller MVC Backbone.js Ger struktur Bygger på MVC konceptet Tvingar

Läs mer

Exemple på Tentauppgifter Webbprogrammering

Exemple på Tentauppgifter Webbprogrammering LUNDS TEKNISKA HÖGSKOLA 1(6) Institutionen för datavetenskap Exemple på Tentauppgifter Webbprogrammering 2019 02 28 version 2019-03-20 15:36:14+01:00 Tillåtna hjälpmedel: inga. Detta är ett exempel på

Läs mer

Webbtjänster med API er

Webbtjänster med API er Webbtjänster med API er Mål med lektionen! Veta kursmålen. Lite grunder om WCF Vem är jag? Mitt namn är Björn Jönsson och jobbar på Tahoe Solutions, ni når mig via mail: bjorn.jonsson@tahoesolutions.se

Läs mer

Innehåll Introduktion... 3 InteractiveScene.config... 3 Scener <scenes>... 3 Typsnitt <fonts>... 3 Övergångar <transitions>...

Innehåll Introduktion... 3 InteractiveScene.config... 3 Scener <scenes>... 3 Typsnitt <fonts>... 3 Övergångar <transitions>... Innehåll Introduktion... 3 InteractiveScene.config... 3 Scener ... 3 Typsnitt ... 3 Övergångar ... 4 Mall för slide ... 5 , ...

Läs mer

JavaScript in SharePoint and not just for Apps. Wictor Wilén

JavaScript in SharePoint and not just for Apps. Wictor Wilén JavaScript in SharePoint and not just for Apps Wictor Wilén Wictor Wilén Agenda Varför JavaScript? JavaScript bibliotek SharePoint JS bibliotek JavaScript Client Side Object Model (JSOM/CSOM) REST Client

Läs mer

Introduktion Schenker-BTL AB, Stab IT Beskrivning över informationsintegreringmed Schenker, metodbeskrivning version 1.

Introduktion Schenker-BTL AB, Stab IT Beskrivning över informationsintegreringmed Schenker, metodbeskrivning version 1. Schenker har interna system som handhar information som är av intresse för våra kunder/partners. Idag finns ett flertal av dem tillgängliga via Internet, sk Online-tjänster. Dessa erbjuder inte bara hämtning

Läs mer

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 1 2 - Block, räckvidd Dagens föreläsning Programmering i Lisp - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning - Felhantering (kap 17) icke-normala återhopp catch

Läs mer

Introduktion till integrering av Schenkers e-tjänster. Version 2.0

Introduktion till integrering av Schenkers e-tjänster. Version 2.0 Introduktion till integrering av Schenkers e- Version 2.0 Datum: 2008-06-18 Sida 2 av 8 Revisionshistorik Lägg senaste ändringen först! Datum Version Revision 2008-06-18 2.0 Stora delar av introduktionen

Läs mer

TUTORIAL: SAMLING & KONSOLL

TUTORIAL: SAMLING & KONSOLL TUTORIAL: SAMLING & KONSOLL Denna tutorial är en fortsättning på den tutorial där vi skapade klassen Car och sedan objekt av denna klass. Vi skall nu lära oss att lagra dessa objekt i en samling och även

Läs mer

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning 1 Dagens föreläsning Programmering i Lisp - Block, räckvidd - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning - Felhantering (kap 17) icke-normala återhopp catch

Läs mer

TDP013 Node.js, JSCoverage, Mocha. Marcus Bendtsen Institutionen för Datavetenskap

TDP013 Node.js, JSCoverage, Mocha. Marcus Bendtsen Institutionen för Datavetenskap TDP013 Node.js, JSCoverage, Mocha Marcus Bendtsen Institutionen för Datavetenskap Återblick - Progressive Enhancement HTML, CSS, JavaScript - Klienten Den statiska webben... Vi känner till HTML, CSS och

Läs mer

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier

Arv. Fundamental objekt-orienterad teknik. arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier Arv Fundamental objekt-orienterad teknik arv i Java modifieraren protected Lägga till och modifiera metoder med hjälp av arv Klass hierarkier Programmeringsmetodik -Java 165 Grafisk respresentation: Arv

Läs mer

Services + REST och OAuth

Services + REST och OAuth Services + REST och OAuth Syftet med Services Skapa ett Drupal API för att exponera webb- API:er. Officiella versionen - Create a unified Drupal API for web services to be exposed in a variety of different

Läs mer

Webbtjänster med API er

Webbtjänster med API er Webbtjänster med API er Mål med lektionen! Titta på hur service:ar fungerar och hur vi programmerar dem. Vad lektionen omfattar WCF Service WCF Services Vad är en WCF service? En WCF Service är ett program

Läs mer

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017 Lambdas (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017 Funktioner En funktion (i programmeringstermer) är en operation som tar ett eller flera argument,

Läs mer

1 Klasser och objektorientering Vad är objektorientering?

1 Klasser och objektorientering Vad är objektorientering? 1 Klasser och objektorientering Vad är objektorientering? Det finns olika synsätt på programmering, dessa olika synsätt kallas för paradigm. De vanligaste paradigmen är det imperativa/proceduriella, det

Läs mer

Programutvecklingsprojekt Projektgrupp Elvin. Detailed Design Document

Programutvecklingsprojekt Projektgrupp Elvin. Detailed Design Document Programutvecklingsprojekt 2003-04-24 Projektgrupp Elvin Detailed Design Document Björn Engdahl Fredrik Dahlström Mats Eriksson Staffan Friberg Thomas Glod Tom Eriksson engdahl@kth.se fd@kth.se d94-mae@nada.kth.se

Läs mer

Programmering B med Visual C++ 2008

Programmering B med Visual C++ 2008 Programmering B med Visual C++ 2008 Innehållsförteckning 1 Repetition och lite nytt...5 I detta kapitel... 5 Programexekvering... 5 Loop... 5 Källkod... 6 Verktyg... 6 Säkerhetskopiera... 6 Öppna, kompilera,

Läs mer

TDDD78 Objektorientering: Lagring och livstid

TDDD78 Objektorientering: Lagring och livstid jonas.kvarnstrom@liu.se 2017 TDDD78 Objektorientering: Lagring och livstid Tre sorters variabel (1): Lokal 3 Deklareras i en metod Lokal variabel Varje anrop får sin egen "kopia": Två anrop till foo()

Läs mer

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer. Översikt Klasshierarkier UML klassdiagram Relation mellan klasser mellan klasser och objekt Association ning ing andling Programmering tillämpningar och datastrukturer 2 UML UML Unified Modeling Language

Läs mer

Klient/server. Översikt. Lektion 1: Webbtekniker från Microsoft. Webbteknik från Microsoft. Klient/server. Designmönster. Utrullning.

Klient/server. Översikt. Lektion 1: Webbtekniker från Microsoft. Webbteknik från Microsoft. Klient/server. Designmönster. Utrullning. Klient/server Översikt Webbteknik från Microsoft. Klient/server. Designmönster. Utrullning. Lektion 1: Webbtekniker från Microsoft Microsoft webbtekniker. ASP.NET. Klientsidan. Internet Information Server.

Läs mer

Föreläsning 2. Operativsystem och programmering

Föreläsning 2. Operativsystem och programmering Föreläsning 2 Operativsystem och programmering Behov av operativsystem En dator så som beskriven i förra föreläsningen är nästan oanvändbar. Processorn kan bara ges enkla instruktioner såsom hämta data

Läs mer

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer Java: Utvecklingsverktyg, datatyper, kontrollstrukturer Sven-Olof Nyström Uppsala Universitet 13 juni 2005 1 Utvecklingsverktyg för Java Vi rekommenderar Suns utvecklingsverktyg (SDK, tidigare JDK), se

Läs mer

Ajax TruClient. Erfarenheter, tips och trix från Swedbank IT. Christian Gerdes Performance Engineer, LIGHTS IN LINE AB

Ajax TruClient. Erfarenheter, tips och trix från Swedbank IT. Christian Gerdes Performance Engineer, LIGHTS IN LINE AB Ajax TruClient Erfarenheter, tips och trix från Swedbank IT Christian Gerdes Performance Engineer, LIGHTS IN LINE AB Intro Lite om Swedbanks Teknik Test Varför TruClient En ny teknik kräver ett nytt tänk

Läs mer

Översikt. Installation av EasyPHP 1. Ladda ner från http://www.easyphp.org/ Jag använder Release 5.3.4.0 2. Installera EasyPHP.

Översikt. Installation av EasyPHP 1. Ladda ner från http://www.easyphp.org/ Jag använder Release 5.3.4.0 2. Installera EasyPHP. Laboration 1 Översikt 1. Att komma igång med laborationsmiljön a. installera Aptana Studio 3 b. Installera EasyPHP 2. Testa lite programmering a. Testa enkla uppgifter b. Testa automatiskt 3. Skapa inloggningsformulär

Läs mer

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt Föreläsning 4 Klasser Och Objekt Klass Beskrivning av en objekttyp Beskriver egenskaper och beteende (fält och metoder) Klassen fungerar som en ritning Objekt skapas från klassbeskrivningen - instansieras

Läs mer

JavaScript. Innehåll. Historia. Document object model DHTML. Varför Javascript?

JavaScript. Innehåll. Historia. Document object model DHTML. Varför Javascript? Innehåll JavaScript En introduktion till skriptspråket JavaScript och till DOM Scripting Introduktion till JavaScript och DOM JavaScript Syntax DOM och DOM Scripting Händelsehantering och CSS Historia

Läs mer

Räkna med ASP.NET MVC 3

Räkna med ASP.NET MVC 3 Instruktion Räkna med ASP.NET MVC 3 Introduktionsuppgift Författare: Mats Loock Kurs: ASP.NET MVC Kurskod:1DV409 Innehåll Du ska följa steg-för-steg -instruktionen i denna introduktionsuppgift och skapa

Läs mer

YH, Systemutvecklare agil webbprogrammering 400 Yh- poäng (utbildningsnummer: ) Connectivity och Internet of things IoT

YH, Systemutvecklare agil webbprogrammering 400 Yh- poäng (utbildningsnummer: ) Connectivity och Internet of things IoT Huvudmoment Skapa i grupp en applikation som pratar med en enhet och ger en användare möjlighet att läsa av och/eller styra den. Utforma och koda ett användargränssnitt för ovannämnda applikation utifrån

Läs mer

Webbtjänster med API er

Webbtjänster med API er Webbtjänster med API er Repetera kunskaperna Mål med lektionen! Vad lektionen omfattar Repetition av kursen. Webbtjänster? En webbtjänst är en tjänst som erbjuds av en elektronisk anordning till en annan

Läs mer

Säkra Designmönster (Secure Design Patterns)

Säkra Designmönster (Secure Design Patterns) Säkra Designmönster (Secure Design Patterns) Marcus Bendtsen Institutionen för Datavetenskap (IDA) Avdelningen för Databas- och Informationsteknik (ADIT) Säkra designmönster Beskrivningar eller mallar

Läs mer

Att förstå hur man konstruerar modulära program Att kunna skapa nya funktioner Att förstå hur data skickas mellan funktioner

Att förstå hur man konstruerar modulära program Att kunna skapa nya funktioner Att förstå hur data skickas mellan funktioner Lektion 4, del 1, kapitel 10 Funktioner i JavaScript Inlärningsmål Att förstå hur man konstruerar modulära program Att kunna skapa nya funktioner Att förstå hur data skickas mellan funktioner Introduktion

Läs mer

Objektorientering: Lagring och livstid

Objektorientering: Lagring och livstid TDDD78, TDDE30, 729A85 jonas.kvarnstrom@liu.se 2018 Objektorientering: Lagring och livstid Tre sorters variabler Tre sorters variabel (1): Lokal 2 Lokal variabel Deklareras inuti en metod Vid varje anrop

Läs mer

1ME323 Webbteknik 3 Lektion 6 API. Rune Körnefors. Medieteknik Rune Körnefors

1ME323 Webbteknik 3 Lektion 6 API. Rune Körnefors. Medieteknik Rune Körnefors 1ME323 Webbteknik 3 Lektion 6 API Rune Körnefors Medieteknik 1 2019 Rune Körnefors rune.kornefors@lnu.se Agenda API (Application Programming Interface) Mashup Flickr API Google Maps API Labb 6 2 API (Application

Läs mer

1 Comparator & Comparable

1 Comparator & Comparable 1 Comparator & Comparable 1.1 Implementation av Comparable Att implementera Comparable innebär att man gör objekt av sin klass jämförbara med andra och att det därmed antas existera en naturlig ordning

Läs mer

I den här labben ska vi använda oss av en trevlig nyhet i HTML5: Local Storage, för att implementera en sorts lokal gästbok.

I den här labben ska vi använda oss av en trevlig nyhet i HTML5: Local Storage, för att implementera en sorts lokal gästbok. Lokal Gästbok I den här labben ska vi använda oss av en trevlig nyhet i HTML5: Local Storage, för att implementera en sorts lokal gästbok. Gästboken ska fungera som så att man har ett fält där man kan

Läs mer

Laboration 1: Figurer i hierarki

Laboration 1: Figurer i hierarki Laboration 1: Figurer i hierarki Bakgrund Två grundläggande tekniker i objektorienterad konstruktion är arv och komposition. Mål Laborationen har flera avsikter: 1. Ge kunskaper i hur program kan organiseras

Läs mer

Användarhandledning Version 1.2

Användarhandledning Version 1.2 Användarhandledning Version 1.2 Innehåll Bakgrund... 2 Börja programmera i Xtat... 3 Allmänna tips... 3 Grunderna... 3 Kommentarer i språket... 4 Variabler... 4 Matematik... 5 Arrayer... 5 på skärmen...

Läs mer

Tentamen i Introduktion till programmering

Tentamen i Introduktion till programmering Tentamen i Introduktion till programmering Kurskod: Skrivtid: D0009E 09:00-13:00 (4 timmar) Totalt antal uppgifter: 7 Totalt antal poäng: 38 Tentamensdatum: 2014-05-17 Jourhavande lärare: Tillåtna hjälpmedel:

Läs mer

Platser för att skriva och testa kod online. Workshop om programmering i matematikkurser, version 0.7 senast sparat

Platser för att skriva och testa kod online. Workshop om programmering i matematikkurser, version 0.7 senast sparat Cheat sheets Nedan finns referensblad för fyra olika programmeringsspråk, som kan bli aktuella att använda i matematikundervisning. MATLAB är en välkänd programvara för att göra matematiska beräkningar,

Läs mer

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan. Bankkonto - övning Övningar att göra efter lärardemostration. Filen bankkonto.zip innehåller ett projekt med klassen Bankkonto. Zippa upp denna fil och öppna projektet i BlueJ och skriv vidare på klassen

Läs mer

Objektorientering: Lagring, räckvidd och livstid

Objektorientering: Lagring, räckvidd och livstid TDDD78, TDDE30, 729A85 jonas.kvarnstrom@liu.se 2019 Objektorientering: Lagring, räckvidd och livstid Tre sorters variabler, två sorters metoder Räckvidd och livstid 2 Variabler (lokala och medlemsvariabler)

Läs mer

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015 Objektorienterad Programkonstruktion Föreläsning 7 24 nov 2015 Observer (GoF) Man definierar ett "ett-till-många"-förhållande mellan objekt så att när ett objekt byter tillstånd så uppdateras alla beroende

Läs mer

Manuell import till Lime Pro

Manuell import till Lime Pro Manuell import till Lime Pro Ibland kan det vara nödvändigt att göra en manuell import till Lime Pro, t.e.x. om en fil inte kan importeras och man behöver mer information för att felsöka. I den vanliga

Läs mer

Webbtjänster med API er

Webbtjänster med API er Webbtjänster med API er Mål med lektionen! En lite djupare inblick i RESTfulla tjänster Vad lektionen omfattar RESTful Services Överblick SOAP kan vara lite overkill för vissa specifika web service scenarion.

Läs mer

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat Föreläsning 8 - del 2: Objektorienterad programmering - avancerat Johan Falkenjack johan.falkenjack@liu.se Linköpings universitet Sweden December 4, 2013 1 Innehåll Arv och andra viktiga begrepp Abstrakta

Läs mer

E13 "Behind the Wild"

E13 Behind the Wild E13 "Behind the Wild" Föreläsning 13, HT2014 Det vi missat och lite till Kurs: 1dv403 Webbteknik I Johan Leitet E13 Behind the Wild Dagens agenda Cookies Web storage Context/ändra context Augmentation

Läs mer

E11 "Protection" Föreläsning 11, HT2014 Säkerhet, tillgänglighet. Johan Leitet. Kurs: 1dv403 Webbteknik I

E11 Protection Föreläsning 11, HT2014 Säkerhet, tillgänglighet. Johan Leitet. Kurs: 1dv403 Webbteknik I Föreläsning 11, HT2014 Säkerhet, tillgänglighet E11 "Protection" Kurs: 1dv403 Webbteknik I Johan Leitet E11 Protection Dagens agenda Tillgänglighet Säkerhet Webbsajt vs. Webbapp Webbsida/webbsajt Webbapplikation

Läs mer

Utkast/Version (8) Användarhandledning - inrapportering maskin-till-maskin

Utkast/Version (8) Användarhandledning - inrapportering maskin-till-maskin Utkast/Version Sida 2.0 1 (8) 2017-05-12 Användarhandledning - inrapportering maskin-till-maskin 2 (8) Innehåll 1. Rapportering till VINN eller KRITA... 3 1.1 Allmänt... 3 1.2 Terminologi... 3 2. Hämta

Läs mer

2014-2015 Alla rättigheter till materialet reserverade Easec

2014-2015 Alla rättigheter till materialet reserverade Easec 1 2 Innehåll Introduktion... 3 Azure Client SDK Libraries... 4 Översikt: Azure Client Libraries... 5 Azure SDK... 6 Azure SDK (forts.)... 7 Azure SDK (forts.)... 8 Cloud Services... 10 Cloud Services...

Läs mer

DAT043 - Föreläsning 7

DAT043 - Föreläsning 7 DAT043 - Föreläsning 7 Model-View-Controller, mer om klasser och interface (arv, ) 2017-02-06 Designmönstret Observer avläser Observer Observable meddelar Observer avläser En eller flera objekt registrerar

Läs mer

En snabb titt på XML LEKTION 6

En snabb titt på XML LEKTION 6 LEKTION 6 En snabb titt på XML Bokstaven x i Ajax står för XML, ett mycket användbart beskrivningsspråk som gör det möjligt för Ajax-tillämpningar att hantera komplex strukturerad information. I den här

Läs mer

Webbtjänster med API er

Webbtjänster med API er Webbtjänster med API er Mål med lektionen! Titta på WCF klienter och förstå dessa. Vad lektionen omfattar WCF Clients Komma åt endpoints Vi har pratat om WCF i stort och vi har pratat om hur vi bygger

Läs mer

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList. Institutionen för Datavetenskap Göteborgs universitet HT2009 DIT011 Objektorienterad programvaruutveckling GU (DIT011) Föreläsning 3 Innehåll Lite om felhantering och Exceptions Mer om variabler och parametrar

Läs mer

Optimering av prestanda

Optimering av prestanda 2018-01-10 Axiell Arena Optimering av prestanda Axiell Sverige AB, Box 24014, 224 21 Lund. Besöksadress: Fältspatsvägen 4, 224 78 Lund tel 046-270 04 00, e-post: axiellsverige@axiell.com, www.axiell.se

Läs mer

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDDE10 TDDE11, 725G90. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU TDDE10 TDDE11, 725G90 Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU På denna föreläsning: Introduktion OOP Instanser, instansvariabler, instansmetoder

Läs mer

Modul 8 Hantering av indata

Modul 8 Hantering av indata Modul 8 Hantering av indata Indata De flesta webbplatser idag tillåter användare att mata in data Utan denna möjlighet hade inte webben varit vad den är idag Tyvärr innebär detta stora säkerhetsrisker

Läs mer

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 4. Peter Dalenius Institutionen för datavetenskap

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 4. Peter Dalenius Institutionen för datavetenskap Uppmärkningsspråk TDP007 Konstruktion av datorspråk Föreläsning 4 Peter Dalenius Institutionen för datavetenskap 2015-02-03 Från förra gången XML-dokument specificeras med t.ex. en DTD Två olika sätt att

Läs mer

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering!

Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering! Samlingar, Gränssitt och Programkonstruktion! Förelasning 11!! TDA540 Objektorienterad Programmering! Samlingar Vi kommer att behöva hantera samlingar av objekt - Har oftast använd Array (fält) - Bra om

Läs mer

Projekt intranät Office 365 av Per Ekstedt

Projekt intranät Office 365 av Per Ekstedt Projekt intranät Office 365 av Per Ekstedt 1 BESKRIVNING AV UTFÖRANDE Uppdraget planeras att genomföras med ett agilt arbetssätt samt best practice från Microsoft gällande SharePoint online. Uppdraget

Läs mer

Arv och polymorfism i Java

Arv och polymorfism i Java 1 (5) Arv och polymorfism i Java Objektorienterad programmering 5 Syfte Att ge en introduktion till arvsmekanismen i Java. Mål Efter övningen skall du kunna definiera klasser med arv i Java. förstå hur

Läs mer

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten? Programmeringsteknik och Matlab Övning 4 Dagens program Övningsgrupp 2 (Sal Q22/E32) Johannes Hjorth hjorth@nada.kth.se Rum 4538 på plan 5 i D-huset 08-790 69 02 Kurshemsida: http://www.nada.kth.se/kurser/kth/2d1312

Läs mer

E13 Behind the Wild. Dagens agenda. Cookies Context/ändra context Augmentation (förstärkning) Klassiskt arv Att låna metoder Namespaces Postludium

E13 Behind the Wild. Dagens agenda. Cookies Context/ändra context Augmentation (förstärkning) Klassiskt arv Att låna metoder Namespaces Postludium E13 Behind the Wild Dagens agenda Cookies Context/ändra context Augmentation (förstärkning) Klassiskt arv Att låna metoder Namespaces Postludium Cookies Alternativ: IP-adress URL

Läs mer

Gränssnitt för FakeGranska. Lars Mattsson

Gränssnitt för FakeGranska. Lars Mattsson Gränssnitt för FakeGranska av Lars Mattsson (larsmatt@kth.se) Innehållsförteckning 1 Introduktion...3 2 Genomförande:...3 3 Användning...5 4 Kända buggar:...6 5 Källförteckning...6 2 1 Introduktion Taken

Läs mer

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018

Mutability och State. Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018 Mutability och State Objekt-orienterad programmering och design (DIT953) Niklas Broberg / Johannes Åman Pohjola, 2018 Immutability Ett icke muterbart (immutable) objekt är ett objekt vars tillstånd inte

Läs mer

MVC med Javascript och Ajax. Filip Ekberg

MVC med Javascript och Ajax. Filip Ekberg MVC med Javascript och Ajax Filip Ekberg MVC med Javascript och Ajax Lektion 7 ASP.NET MVC mail@filipekberg.se Veckans mål ASP.NET MVC Repetition & Diskussion Vad är MVC? Vad är ASP.NET MVC? Hur skapar

Läs mer

Diagnostisktprov Utveckla i Azure

Diagnostisktprov Utveckla i Azure .easec Diagnostisktprov Utveckla i Azure Mats Johannesson 2015-06-08 1 o Indikerar ett svar önskas. Flera svar önskas. Maxpoäng: 86 Din poäng: Godkänt: 43 poäng Väl Godkänt: 60 poäng 2 1. Vilka fyra alternativ

Läs mer

JavaScript. DOM Scripting

JavaScript. DOM Scripting JavaScript DOM Scripting Vad är Document object Model (DOM)? En standardiserad modell där man ser en webbsida och dess innehåll som objekt document.getelementsbytagname( p ); document.getelementbyid( mittid

Läs mer

Introduktion till arv

Introduktion till arv Introduktion till arv 6 INTRODUKTION TILL ARV Arv Generell-Speciell Arv för att utnyttja det vi redan gjort Återanvändning Basklass Härledd klass Varför arv? Inför en subklass för att uttrycka specialisering

Läs mer

L04.1 Marodören. Inledning. Mål. Genomförande. Uppgift 1 Hello World. Moment I

L04.1 Marodören. Inledning. Mål. Genomförande. Uppgift 1 Hello World. Moment I L04.1 Marodören Inledning Genom att öva sig på de grundläggande koncepten i JavaScript öppnas vägen allteftersom till de mer avancerade funktionerna. Man måste lära sig krypa innan man kan gå, även i JavaScript!

Läs mer

Snabbguide Visma Compact API Copyright 2006-2010 Visma Spcs AB

Snabbguide Visma Compact API Copyright 2006-2010 Visma Spcs AB Snabbguide Visma Compact API Copyright 2006-2010 Visma Spcs AB Komma igång med Compact API Hur APIet fungerar Visma Compacts API läser och skriver direkt till databasen via ett antal färdiga metoder som

Läs mer

Kopiering av objekt i Java

Kopiering av objekt i Java 1 (6) Kopiering av objekt i Java Först När du läser detta papper bör du samtidigt studera dokumentationen för klasserna Object, Cloneable (java.lang) och ArrayList (java.util). Mycket blir klarare genom

Läs mer

EnKlass. Instans 3 av EnKlass. Instans 2 av EnKlass

EnKlass. Instans 3 av EnKlass. Instans 2 av EnKlass Övningstillfälle 4 Klasser och objekt (s. 221 ff.) Syfte 1: En naturlig fortsättning på koncepten abstraktion och inkapsling! Funktion (återanvändning av skyddad, säker och testad kod) Modul (återanvändning

Läs mer

Emacs. Eric Elfving Institutionen för datavetenskap (IDA) 22 augusti 2016

Emacs. Eric Elfving Institutionen för datavetenskap (IDA) 22 augusti 2016 Emacs Eric Elfving Institutionen för datavetenskap (IDA) 22 augusti 2016 Historia 2/21 Utvecklas konstant, från 70-talet Är en generellt texteditor (INTE ordbehandlare) som fokuserar på texten, inte utseendet

Läs mer

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Kort om klasser och objekt En introduktion till GUI-programmering i Java Kort om klasser och objekt En introduktion till GUI-programmering i Java Klasser En klass är en mall för hur man ska beskriva på något. Antag att vi har en klass, Bil. Den klassen innehåller en lista på

Läs mer

JavaScript del 9 Dynamik och animeringar

JavaScript del 9 Dynamik och animeringar JavaScript del 9 Dynamik och animeringar Det sista vi ska titta på när det kommer till att lära oss JavaScript är hur vi skapar dynamik på vår webbplats, ge användarna chansen att påverka vad som händer

Läs mer

Att sätta upp trådlöst med Cisco Controller 2100 series och Cisco AP 1200 series

Att sätta upp trådlöst med Cisco Controller 2100 series och Cisco AP 1200 series Att sätta upp trådlöst med Cisco Controller 2100 series och Cisco AP 1200 series http://www.cisco.com/en/us/docs/wireless/controller/2100/quick/guide/ctrl206q.ht ml http://www.cisco.com/univercd/cc/td/doc/product/wireless/airo1000/1000hig3/100

Läs mer

Fortsättningskurs Webbklientprogrammering

Fortsättningskurs Webbklientprogrammering Tentamen, Fortsättningskurs Webbklientprogrammering (40 YH-poäng) Plats: Övningstenta Tid: Övningstenta Tillåtna hjälpmedel: Papper, penna, suddgummi, linjal. Ej tillåtna hjälpmedel: Datorer, mobiltelefoner,

Läs mer

! HTML Formulär! JavaScript! Syntax! Events! DOM. ! URL variabler i en query string (get) ! HTTP post request (post)

! HTML Formulär! JavaScript! Syntax! Events! DOM. ! URL variabler i en query string (get) ! HTTP post request (post) OVERVIEW JAVASCRIPT Beteende! HTML Formulär! JavaScript! Syntax! Events! DOM! Validering av fomulär WEBBPROGRAMMERING PÅ KLIENTSIDAN HTML FORMULÄR! Skriptspråk som körs på klientsidan (klientskript)! Koden

Läs mer

App-klient för smartphones... 2. Power BI... 3. Arbetsflöde... 4. CRM Online... 5. Webb-klienten... 6. Dokumenthantering... 7. Molnet...

App-klient för smartphones... 2. Power BI... 3. Arbetsflöde... 4. CRM Online... 5. Webb-klienten... 6. Dokumenthantering... 7. Molnet... Nyheter i Dynamics NAV 2016 Innehåll App-klient för smartphones... 2 Power BI... 3 Arbetsflöde... 4 CRM Online... 5 Webb-klienten... 6 Dokumenthantering... 7 Molnet... 8 Elektronisk fakturering... 9 App-klient

Läs mer

Objektorienterad programmering

Objektorienterad programmering Objektorienterad programmering Emil Ahlqvist (c10eat@cs.umu.se) Didrik Püschel (dv11dpl@cs.umu.se) Johan Hammarström (c08jhm@cs.umu.se) Hannes Frimmel Moström (c10hml@cs.umu.se) 1 1. Introduktion 1.1 Objektorienterad

Läs mer

Inledande programmering med C# (1DV402) Tärningarna ska kastas

Inledande programmering med C# (1DV402) Tärningarna ska kastas Tärningarna ska kastas Upphovsrätt för detta verk Detta verk är framtaget i anslutning till kursen Inledande programmering med C# vid Linnéuniversitetet. Du får använda detta verk så här: Allt innehåll

Läs mer

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion Introduktion till programmering Föreläsning 4: Villkor och rekursion 1 1 Några inbyggda funktioner (med resultat!) Konverterar mellan de grundläggande typerna: >>> int("32") 32 >>> int(3.999) 3 >>> float(32)

Läs mer

Kursplanering Utveckling av webbapplikationer

Kursplanering Utveckling av webbapplikationer Kursplanering Utveckling av webbapplikationer Fakta Ämne Programmering Poäng 40 Yh-poäng Kurskod YSYS-WEB Klass Systemutvecklare.NET Syfte och koppling till yrkesrollen För att kunna arbeta som systemutvecklare

Läs mer

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDDE10 TDDE11, 725G90/1. Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU TDDE10 TDDE11, 725G90/1 Objektorienterad programmering i Java, Föreläsning 2 Erik Nilsson, Institutionen för Datavetenskap, LiU På denna föreläsning: Introduktion OOP Instanser, instansvariabler, instansmetoder

Läs mer

Övningar Dag 2 En första klass

Övningar Dag 2 En första klass Kurs i C++ Sid 1 (5) Övningar Dag 2 En första klass Denna övning går ut på att steg för steg bygga upp en klass och skapa objekt. Vi kommer att utgå från en sammansatt datatyp i en struct och parallellt

Läs mer

Webbteknik II. Föreläsning 5. Restless farewell. John Häggerud, 2011

Webbteknik II. Föreläsning 5. Restless farewell. John Häggerud, 2011 Webbteknik II Föreläsning 5 Restless farewell HTTP Request HTTP verbs (methods): GET, POST, HEAD, DELETE, PUT, OPTIONS, TRACE, CONNECT http://www.w3.org/protocols/rfc2616/rfc2616-sec9.html variable=value&variable2=value2

Läs mer

Karlstads Universitet, Datavetenskap 1

Karlstads Universitet, Datavetenskap 1 DAV B04 - Databasteknik KaU - Datavetenskap - DAV B04 - MGö 229 PHP Hypertext Preprocessor Scriptspråk på serversidan Innebär att webbservern översätter php-scripten innan sidan skickas till webbläsaren,

Läs mer

Programbeskrivning. Chaos på Web. Version 1.0 2005-09-21

Programbeskrivning. Chaos på Web. Version 1.0 2005-09-21 2005-09-21 Programbeskrivning Chaos på Web Version 1.0 Chaos systems AB Tel. 08-410 415 00 e-post: info@chaos.se Solna strandväg 18, 6tr Fax. 08-29 06 66 http://www.chaos.se 171 54 SOLNA Reg. nr: 556476-6813

Läs mer

Mål med lektionen! Repetera och befästa kunskaperna.

Mål med lektionen! Repetera och befästa kunskaperna. Entity Framework Mål med lektionen! Repetera och befästa kunskaperna. Vad lektionen omfattar Repetera och gå igenom kursen lite snabbt. Vilka problem vill vi lösa? Vi arbetar med Webbapplikationer Vi kommer

Läs mer

Belastningstester med Visual Studio 2008 - Gränssnittet

Belastningstester med Visual Studio 2008 - Gränssnittet Belastningstester med Visual Studio 2008 - Gränssnittet Belastningstester med Visual Studio 2008 - Gränssnittet ANVÄNDARGRÄNSSNITTET Belastningstester med Visual Studio 2008 - Gränssnittet Test typer Alla

Läs mer