maanantai 8. heinäkuuta 2019

Console: Duplicate md-option values are not allowed in a select. Duplicate value "ID" found.

Halusin sovelluksessa kyetä luomaan uuden alustan kopioimalla vanhan. Uudessa alustassa luodessa uutta palasta alustaan alkoi console huutamaan jostain syystä md-optionin tuloksen monistumisesta. Consolessa näkyi id, minkä avulla pääsin syyn jäljille. Kyseessä oli oma käyttäjä id.

Sovellus toimii oikein eikä siinä näy peruskäyttäjälle rikkonaisuutta, joten nyt kyseessä oli vain oma, koodipuolen virhe. Googlettelin aluksi virhekoodia, sille oli annettu ratkaisuksi laittaa md-option value {{ }} merkkien sisään. Omassa koodissa asiat olivat jo näin, joten tämä kikka kolmonen ei minua auttanut.

Seuraavaksi suuntasin uuden palasen luonti formiin ja tutkailin sitä. Aluksi etsin formista kaikki md-optionia käyttävät kohdat ja vertasin niitä consolessa näkyvään viestiin. If-lauseen avulla lopulta löysin oikean kohdan. Poistin kyseisen kohdan käytöstä ja testasin toimiiko sovellus kuinka ilman sitä. Virheilmoitus katosi consolesta. Mikä aiheuttaa tähän palikkaan tuplaantumisen?

Seuraavana poistin rikkinäisestä kohdasta kommentit ja kävin tutkimaan mitä kaikkea kyseinen palikka käyttää koodissa. Päädyin lopulta funktioon, joka tekee itse kopion ja huomasin, ettei funktio anna missään vaiheessa sharedUsersille uutta arvoa, kopioi vain karkeasti vanhat arvot. Tämä ei tietenkään ole hyvä asia, sillä uuden alustan ei ole tarkoitus käyttää kopioidun alustan käyttäjiä vaan sille pitäisi kyetä luomaan omat.

Tämä ongelma ratkesi lopulta yksinkertaisella rivin lisäyksellä:
uusialusta.sharedUsers = id;

Id on tässä tapauksessa kopion tekijän id, jolloin kaikki alustalle kopioituvat asiat ovat automaattisesti myös käyttäjälleen itselleen jaettuja. Alustalla voi erikseen muokata myöhemmin oikeuksia, minkä lisäksi palasten luoja on joka tapauksessa aina yksi oikeuksien omistajista. Lisäys ei siis haittaa kokonaisuuden toimivuutta.