Vinnaren i pepparkakshustävlingen!
  • 1
  • 2
2024-07-15, 12:45
  #1
Medlem
Finikantens avatar
Hej!
Jag använder den här koden tillsammans med en Wix data-backend-kod och är minst sagt frustrerad över att det envisas med att stå "true" i både databasfältet och på sidan istället för det faktiska numret i både databasen och på sidan. Så hur kan jag lösa detta? Fälttypen likes1 är inställd på tal (inte text). Detta handlar om en gilla-funktion som går ut på att klicka på ett tomt hjärta som då blir fullt och för varje gilla ökar totalvärdet som ska visas på sidan. Men det står alltså true istället

Kod:
$w(“#emptyHeart1”).onClick((event) => {
wixData.get(“Members”, memberId)
.then((memberInfo) => {
$w(‘#emptyHeart1’).collapse();
$w(‘#fullHeart1’).expand();
$w(‘#likes1’).text = (parseInt($w(‘#likes1’).text) + 1).toString();
memberInfo.likes1 = true;
wixData.update(‘Members’, memberInfo).catch();
})
});

Backend

Kod:
import wixData from ‘wix-data’;
export function Members_likes1(item, context) {
if (item.likes1) {
return wixData.get(context.collectionName, item._id, { “suppressHooks”: true })
.then(itemToUpdate => {
itemToUpdate.likes1 ? itemToUpdate.likes1 += 1 : itemToUpdate.likes1 = 1;
   return itemToUpdate;
})
}
return item;
}

Jag är även konfys över en annan sak. Min backend-kod verkar vara för ett databasfält med ett visst namn (likes1) men jag har fält med olika namn för likes (likes1, likes2, likes 3 etc.) och undrar om ett enda namn som t ex "files" kan gälla för dem alla? Eller måste jag kopiera den ursprungliga koden och klistra in nya med varje fältnamn i backend?
__________________
Senast redigerad av Finikanten 2024-07-15 kl. 13:01.
Citera
2024-07-15, 13:08
  #2
Bannlyst
Tycker mig se memberInfo.likes1 = true; i koden? true + 1 = true + true = true.

För likes1, likes2, … löses med lämpliga index.

Gräslig kod för övrigt.
Citera
2024-07-15, 13:58
  #3
Medlem
Finikantens avatar
Citat:
Ursprungligen postat av PullahMutler
Tycker mig se memberInfo.likes1 = true; i koden? true + 1 = true + true = true.

För likes1, likes2, … löses med lämpliga index.

Gräslig kod för övrigt.

Jag fick koden härifrån https://jonatandor35.wixsite.com/test/like/2 men där heter som synes filen bara "files" i backend. Har du något förslag om hur jag bör skriva istället så att jag slipper true ihuvudtaget?
Citera
2024-07-15, 16:25
  #4
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av PullahMutler
Tycker mig se memberInfo.likes1 = true; i koden? true + 1 = true + true = true.

För likes1, likes2, … löses med lämpliga index.

Gräslig kod för övrigt.
I Javascript så gäller
Kod:
true true == 
och till och med
Kod:
true true === 
(testat i konsollen och i Node)

Bonusläsning: https://dev.to/neutrino2211/avoiding...ut-true--1-pn9
__________________
Senast redigerad av Enterprise 2024-07-15 kl. 16:29.
Citera
2024-07-15, 17:05
  #5
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Finikanten
Jag är även konfys över en annan sak. Min backend-kod verkar vara för ett databasfält med ett visst namn (likes1) men jag har fält med olika namn för likes (likes1, likes2, likes 3 etc.) och undrar om ett enda namn som t ex "files" kan gälla för dem alla? Eller måste jag kopiera den ursprungliga koden och klistra in nya med varje fältnamn i backend?
Utan att veta hur det ser ut så är det väl logiskt att likes enbart har ett fält i databasen, eftersom varje medlemsid rimligen enbart kan ha ett (1) antal likes, inte flera.

Så att du i frontend-koden tydligen har flera olika objekt med likes, beror väl på att flera medlemmar visas på sidan. Det får anses som dålig practice att använda element-ID som "likes1". Jag förstår inte riktigt syftet med det. Istället för
Kod:
$W("#emptyHeart1").onClick(---kod här---)

Så borde man sätta de element som man ska kunna klicka för att addera likes som klassen heart-container eller liknande:
Kod:
$w(".heart-container").onClick((event) => {
    const 
event.target;

    
wixData.get("Members"memberId)
        .
then((memberInfo) => {
            const 
clickedContainer $w(t).closest('.heart-container');
            const 
emptyHeart clickedContainer.find('.empty-heart');
            
emptyHeart.collapse();

            const 
fullHeart clickedContainer.find('.full-heart');
            
fullHeart.expand();

            const 
textBox clickedContainer.find('.likes-text');
            
textBox.text = (parseInt(textBox.text10) + 1).toString();

            
memberInfo.likes true;
            
wixData.update("Members"memberInfo).catch((error) => {
                
console.error("Failed to update member info:"error);
            });
        })
        .catch((
error) => {
            
console.error("Failed to get member info:"error);
        });
}); 


Något sådant. Dock förusätter detta att HTML-koden för din sida ändras så att alla klickbara hjärtcontainrar får klassen heart-container, att tomma hjärtan får klassen empty-heart, att full hjärtan får klassen full-heart och siffran där antal likes står får klassen likes-text.

Backend-koden uppdateras för att ta bort likes1-referensen:
Kod:
import wixData from 'wix-data';

export function Members_likes(itemcontext) {
    if (
item.likes) {
        return 
wixData.get(context.collectionNameitem._id, { "suppressHooks"true })
            .
then(itemToUpdate => {
                
itemToUpdate.likes itemToUpdate.likes += itemToUpdate.likes 1;
                return 
itemToUpdate;
            });
    }
    return 
item;

__________________
Senast redigerad av Enterprise 2024-07-15 kl. 17:16.
Citera
2024-07-15, 23:20
  #6
Medlem
Finikantens avatar
Citat:
Ursprungligen postat av Enterprise
I Javascript så gäller
Kod:
true true == 
och till och med
Kod:
true true === 
(testat i konsollen och i Node)

Bonusläsning: https://dev.to/neutrino2211/avoiding...ut-true--1-pn9

Tack, inte för att jag begriper vad ni menar med true + true men sidan du länkade till verkar åtminstone förklara någorlunda hur jag ska tänka.
Citera
2024-07-15, 23:21
  #7
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Finikanten
Tack, inte för att jag begriper vad ni menar med true + true men sidan du länkade till verkar åtminstone förklara någorlunda hur jag ska tänka.
Essensen är att koden som du har fungerar i den delen. Det är inte det som det är fel på.
Citera
2024-07-15, 23:34
  #8
Medlem
Finikantens avatar
Citat:
Ursprungligen postat av Enterprise
Utan att veta hur det ser ut så är det väl logiskt att likes enbart har ett fält i databasen, eftersom varje medlemsid rimligen enbart kan ha ett (1) antal likes, inte flera.

Så att du i frontend-koden tydligen har flera olika objekt med likes, beror väl på att flera medlemmar visas på sidan. Det får anses som dålig practice att använda element-ID som "likes1". Jag förstår inte riktigt syftet med det. Istället för
Kod:
$W("#emptyHeart1").onClick(---kod här---)

Så borde man sätta de element som man ska kunna klicka för att addera likes som klassen heart-container eller liknande:
Kod:
$w(".heart-container").onClick((event) => {
    const 
event.target;

    
wixData.get("Members"memberId)
        .
then((memberInfo) => {
            const 
clickedContainer $w(t).closest('.heart-container');
            const 
emptyHeart clickedContainer.find('.empty-heart');
            
emptyHeart.collapse();

            const 
fullHeart clickedContainer.find('.full-heart');
            
fullHeart.expand();

            const 
textBox clickedContainer.find('.likes-text');
            
textBox.text = (parseInt(textBox.text10) + 1).toString();

            
memberInfo.likes true;
            
wixData.update("Members"memberInfo).catch((error) => {
                
console.error("Failed to update member info:"error);
            });
        })
        .catch((
error) => {
            
console.error("Failed to get member info:"error);
        });
}); 


Något sådant. Dock förusätter detta att HTML-koden för din sida ändras så att alla klickbara hjärtcontainrar får klassen heart-container, att tomma hjärtan får klassen empty-heart, att full hjärtan får klassen full-heart och siffran där antal likes står får klassen likes-text.

Backend-koden uppdateras för att ta bort likes1-referensen:
Kod:
import wixData from 'wix-data';

export function Members_likes(itemcontext) {
    if (
item.likes) {
        return 
wixData.get(context.collectionNameitem._id, { "suppressHooks"true })
            .
then(itemToUpdate => {
                
itemToUpdate.likes itemToUpdate.likes += itemToUpdate.likes 1;
                return 
itemToUpdate;
            });
    }
    return 
item;


För att förklara varför jag använder flera fält för samma funktion kan jag tala om att jag har 6 "bildramar" på profilsidan som ingår i varsin grupp. När en ny bildram klickas fram genom knappen "Next" så innebär det att grupp 1 göms medan grupp 2 blir synlig. Jag kan ju inte döpa varenda bildram till samma som i de övriga grupperna eftersom systemet skulle påpeka att en fil med det namnet redan finns. Men när jag tänker efter så inser jag att elementnamnen på sidan ju kan vara olika men vara kopplade till samma fält. Att jag inte tänkte på det! Ibland är man lite för fokuserad på ett frustrerande huvudproblem så att man lätt blandar ihop korten (talar för mig själv).

Du nämnde HTML men Wix använder sig sällan av det såvida man inte väljer att lägga in en HTML-box på sidan men det är väl trots allt bättre att använda sig av Wix egna kodsystem när man vill få en Wix-funktion att funka?

Jag måste sova nu så jag besvarar din eventuella respons imorgon.
Citera
2024-07-15, 23:58
  #9
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Finikanten
För att förklara varför jag använder flera fält för samma funktion kan jag tala om att jag har 6 "bildramar" på profilsidan som ingår i varsin grupp. När en ny bildram klickas fram genom knappen "Next" så innebär det att grupp 1 göms medan grupp 2 blir synlig. Jag kan ju inte döpa varenda bildram till samma som i de övriga grupperna eftersom systemet skulle påpeka att en fil med det namnet redan finns. Men när jag tänker efter så inser jag att elementnamnen på sidan ju kan vara olika men vara kopplade till samma fält. Att jag inte tänkte på det! Ibland är man lite för fokuserad på ett frustrerande huvudproblem så att man lätt blandar ihop korten (talar för mig själv).

Du nämnde HTML men Wix använder sig sällan av det såvida man inte väljer att lägga in en HTML-box på sidan men det är väl trots allt bättre att använda sig av Wix egna kodsystem när man vill få en Wix-funktion att funka?

Jag måste sova nu så jag besvarar din eventuella respons imorgon.
Även om bildramarna automatiskt döps till likes1 och så vidare så behöver du inte nödvändigtvis använda namnet för att adressera dom. Om du istället gör en generisk kod som adresserar alla bildramar som har en viss klass så du slipper upprepa dig. Alternativt så har du bildramar i form av t.ex. div som ligger i en container div (med visst id) och du kopplar onclick-funktionen till alla divs som ligger under denna ”container”.
Citera
2024-07-16, 09:30
  #10
Medlem
Finikantens avatar
Citat:
Ursprungligen postat av Enterprise
Även om bildramarna automatiskt döps till likes1 och så vidare så behöver du inte nödvändigtvis använda namnet för att adressera dom. Om du istället gör en generisk kod som adresserar alla bildramar som har en viss klass så du slipper upprepa dig. Alternativt så har du bildramar i form av t.ex. div som ligger i en container div (med visst id) och du kopplar onclick-funktionen till alla divs som ligger under denna ”container”.

Tack men problemet är att varje bildram (för att ladda upp och visa en bild) har ett fält var och det beror bland annat på att varje bild har sin egna like-statistik. Om jag skulle lägga samtliga bilder i samma fält i databasen så går det inte längre att särskilja vilka som har fått likes eller inte och hur många varje bild har fått. Risken för ytterligare krångel borde vara överhängande men jag kanske har fel?
Citera
2024-07-16, 10:01
  #11
Medlem
Finikantens avatar
Jag är kanske korkad men jag fattar verkligen inte hur jag ska tolka den avancerade informationen på sidan du länkade till och särskilt inte hur man ska skriva i koden

Min enda lilla begäran är att en ökning av värdet (det vill säga + 1 till likes) ska införas i databasfältet och på sidan som ett nummer när någon klickar på likehjärtat. Nu blir resultatet "true" istället för numret så hur skulle du skriva denna kod för att resultatet ska bli själva numret?

export function emptyHeart1_click(item) {
wixData.get("Members", memberId)
.then((item) => {
$w('#emptyHeart').collapse();
$w('#fullHeart').expand();
$w('#likes').text = (parseInt($w('#likes').text) + 1).toString();
item.likes = true;
wixData.update('Members', item).catch();
})
}

Den här lilla hjälpkoden är något på spåren:

// returns number 123, instead of returning true
// 'hello' and 123 are still coerced to boolean internally to calculate the expression
let x = 'hello' && 123; // x === 123

Kan man skriva något i stil med detta för att få rätt resultat?

let 'true' = 'Number' && + 1;

Ett annat alternativ är if (typeof Number == "number"){ men det verkar inte heller funka.
__________________
Senast redigerad av Finikanten 2024-07-16 kl. 10:24.
Citera
2024-07-16, 10:44
  #12
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Finikanten
Jag är kanske korkad men jag fattar verkligen inte hur jag ska tolka den avancerade informationen på sidan du länkade till och särskilt inte hur man ska skriva i koden

Min enda lilla begäran är att en ökning av värdet (det vill säga + 1 till likes) ska införas i databasfältet och på sidan som ett nummer när någon klickar på likehjärtat. Nu blir resultatet "true" istället för numret så hur skulle du skriva denna kod för att resultatet ska bli själva numret?

export function emptyHeart1_click(item) {
wixData.get("Members", memberId)
.then((item) => {
$w('#emptyHeart').collapse();
$w('#fullHeart').expand();
$w('#likes').text = (parseInt($w('#likes').text) + 1).toString();
item.likes = true;
wixData.update('Members', item).catch();
})
}

Den här lilla hjälpkoden är något på spåren:

// returns number 123, instead of returning true
// 'hello' and 123 are still coerced to boolean internally to calculate the expression
let x = 'hello' && 123; // x === 123

Kan man skriva något i stil med detta för att få rätt resultat?

let 'true' = 'Number' && + 1;

Ett annat alternativ är if (typeof Number == "number"){ men det verkar inte heller funka.
Du måste börja med backend-koden. Det måste vara där felet ligger.
Citera
  • 1
  • 2

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in