-
Notifications
You must be signed in to change notification settings - Fork 7
Modeller
##Modell
I många angular appar används den JSON som returneras från ett REST api även direkt som modell i angular appen. För att separera mellan ett REST-api transportformat och en objektmodell som klienten vill arbeta har man i webcert gjort tydlig skillnad mellan dessa. Ett utkast som hämtas från backend har en struktur - internt i klienten har det ett annat när det editeras. Denna separation ger en större frihet att anpassa klientmodellen för sitt syfte och bättre möjligheter och att tex skriva tester. Att införa ett mer objektorienterat arv från en basmodell (se base.model.js) ger också återanvändning av gemensam kod tex när det gäller att serialisera/deserialisera modellen i kommunikationen med backend.
Modeller används även för andra delar som common.UserModel och common.AvtalModel men i ett betydligt enklare form.
##Attic Flera av intygstyperna har en regler som i princip säger att "Om ruta x är ikryssad, måste även fält Y anges" dvs ett val kan trigga visa/dölj andra fält. Ett exempel på detta är kryssrutan för smittskydd i fk7263. För att kunna hantera kravet att "toggling" av sådana fält skall komma ihåg tidigare inmatad information finns konceptet attic. Som man kan se i bilden nedan som beskriver objektmodellen för utkast så har alla utkastmodeller atticstöd via arv.
Grovt sätt kan man säga att attic konceptet inför en 1 stegs undo funktion där updateToAttic respektive restoreFromAttic för en viss property hanteras manuellt fält för fält via logik i controllers.
##Objektmodell för ett utkast Som framgår av bilden nedan är många delar av ett utkasts modell gemensamma mellan intygstyper och ligger därför i common. Den intygsspecifika modellen utökar och definerar den precisa modellen som respektive intyg hanterar. Grovt sett kan man säga att komponenterna i webcert common har generisk funktionalitet som opererar på alla intygsmodeller (update, clear, from/to transportformat etc) medan varje intygs utkastmodell definerar vilka properties som finns i modellen och ev transformationsfunktioner för resp. property.

##Hur modellen samverkar med andra komponenter ###Flöde från server till klient (editera ett utkast) När ett nytt intygsutkast skapas alt. ett existerande utkast laddas för editering (under ytan samma sak) omvandlar modell-ramverket transportformatet av ett utkast till en intern klientmodell. Detta sker enligt följande skiss.

- Controllern begär en ny modell och anropar model service.
- Servicen delegerar till proxy som gör själva backendanropet
- Servicens callback får resultatet.
- Model.update blir anropad med utkastet i transportformat.
- Modellen mappar och populerar sina definerade properties med informationen.
- Om propertyn är av typen ModelAttr blir följande metoder i ModelAttr objektet :
- defaultValue : Om inkommande värde på propertyn är null/undefined får den defaultValue som aktuellt värde.
- fromTransform : Om modelAttr har en fromTransform funktion blir den anropad och propertyn får det resulterande värdet.
- linkedProperty : Om en linkedProperty är definerad blir dess update funktion anropad. Returnvärdet av denna update funktion blir nuvarande värde.
Det finns ingen spara-knapp för utkast, utan alla ändringar detekteras och autosparas. Nedan är en skiss på det huvudsakliga flödet vid editering i gränssnittet.

- Användaren ändrar ett fält i utkastformuläret
- Det ändrade värdet propageras (via $scope) till utkastmodellen
- Autospara direktivet som lyssnar på form.$dirty upptäcker att ändringar gjorts och schedulerar ett save anrop med en viss delay (för att throttla antalet saverequests)
- UtkastService.save anropas som i sin tur anropar Model.toSendModel för att konvertera modellen till transportformatet.
- Modellen går rekursivt igenom sina properties och anropar toTransform på varje property (om en sådan finns - annars tas nuvarande värde "as-is"). Returnerar en json av utkastet i transportformat.
- Via proxy skickar UtkastService utkastet till backend. (En versionshantering finns med i denna autosaveprocess, där en enkel räknare i modellen säkerställer till att ingen annan uppdaterat samma utkast under tiden man editerar.)