Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se Swiftu. Zároveň využij výhodnou slevovou akci až 30 % zdarma při nákupu e-learningu - více informací.
swift week + discount 30

Diskuze: Blazor - reference a její předání do komponenty

Aktivity
Avatar
Ondřej Šrytr:24.4.2021 11:48

Zdravím,

řeším problém ohledně předání reference komponenty do jiné komponenty. Kód je následující:

Do ref1 předám referenci komponenty Komponenta2, následně ji také předám do Komponenta1 pomocí parametru

<Komponenta1 Reference="ref1"/>

<Komponenta2 @ref="ref1" />

@code {
    public Komponenta2 ref1 { get; set; }
}

Komponenta1, metodu test pro otestování volám z události onclick

@code {
    [Parameter]
    public Komponenta2 Reference { get; set; }

    public void test()
    {
        Reference.Magic();
    }
}

Komponenta2

@code {
    public void Magic()
    {
        Console.WriteLine("Hello reference");
    }
}

Problém je, že vlastnost Reference v Komponenta1 je vždy null. Na internetu se mi nepodařilo najít nic, co by mi pomohlo. Také otázka, zda je to vůbec takhle možné.

Zkusil jsem: ElementReference, ale je to jen reference na samotný element, nikoliv komponentu, takže nelze volat metody v komponentě.

Chci docílit: Předání reference komponenty a zavolat v ní metodu nebo funkci.

 
Odpovědět
24.4.2021 11:48
Avatar
Radek Veverka
Tvůrce
Avatar
Odpovídá na Ondřej Šrytr
Radek Veverka:24.4.2021 14:50

Blazor ukládá elementy a komponenty s @ref do proměnných až potom, co se komponenta vykreslí. Nemůžeš proto nikdy předat hodnotu z @ref takto parametrem další komponetě, protože předání parametrů se děje před vykreslením, proto je předaná hodnota null.

 
Nahoru Odpovědět
24.4.2021 14:50
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Radek Veverka
Tvůrce
Avatar
Odpovídá na Ondřej Šrytr
Radek Veverka:24.4.2021 15:06

Napadá mě to obejít tím, že místo reference na komponentu pošleš komponentě lamda funkci, která ji vrátí:
Komponenta 1:

@code {
    [Parameter]
    public Func<Komponenta2> Reference { get; set; }

    public void test()
    {
        Reference().Magic();
    }
}

Rodičovská komponenta:

<Komponenta1 Reference="@( () => ref1 )"/>

<Komponenta2 @ref="ref1" />

@code {
    public Komponenta2 ref1 { get; set; }
}

Pozor ale, stále platí že musíš test() zavolat až v OnAfterRender, nikoliv už v OnInitialized. Nebo můžeš zavolat po kliku na tlačítko či po jiné události - to už je vše vykreslené a hodnoty @ref uložené.

Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět
24.4.2021 15:06
Avatar
Odpovídá na Radek Veverka
Ondřej Šrytr:24.4.2021 16:39

Díky moc za objasnění. S pomocí lambda funkce to funguje jak má. :)

 
Nahoru Odpovědět
24.4.2021 16:39
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 4 zpráv z 4.