• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Przekazywanie parametru, do interfejsu funkcji.

Cloud VPS
+1 głos
229 wizyt
pytanie zadane 4 listopada 2018 w JavaScript przez ShiroUmizake Nałogowiec (46,300 p.)
zamknięte 5 listopada 2018 przez ShiroUmizake

Pytanie brzmi trochę dziwne, ale teraz wytłumaczę dlaczego:

   this.validator.getStore().login.addEventListener("keyup",
      (event) => this.bindMethod(event, (event) => this.isNickBusy(event)));

Co ten kod robi. Wywołuje magazyn, a ten zwraca obiekt DOM, na którym uruchamiam listener, a ten bindujeMetody oraz element targetingu. Wygląda cudacznie, ale za chwilę powiem dlaczego.

  bindMethod(element, func) {
    window.setTimeout(() => func(element), 100);
  }

Dlaczego tak ? próbowałem, przekazać argument do interfejsu funkcji.

Zrobiłem dokładnie coś takiego:

    this.validator.getStore().password.addEventListener('keyup',
      (event) => window.setTimeout(event => this.isNickBusy(event), 100);

Czyli obiekt Event przekazany do innego obiektu po przez funkcje. 

Czy się udało?

Niestety, zwrócił undefined. Dlatego wykorzystałem te powyższe rozwiązanie.

A chciałbym uzyskać taki efekt? 

   this.validator.getStore().login.addEventListener("keyup",
      (event) => this.bindMethod((event) => this.isNickBusy(event)));

czyli ma przyjąć argumencie funkcje z wcześniejszą wartością, niestety oczywiście tak się nie dzieje.

Wydaje mi się, że nie da się tego zrobić, aczkolwiek może jest jakiś trik na to.

Dla tych co chcą wiedzieć co się dzieje w głębiej:


  isNickBusy(validElement) {
    if (validElement.target.value.length > 3) {
      this.valid = false;
      let logNickRoute = `http://${location.hostname}:${this.config.port}`
        + "/api/" + `${this.config.log_route_nick}`
        + `${validElement.target.value}`;

      Axios.get(logNickRoute, AxiosConfig)
        .then(response => this.isErrorNick(response, validElement))
        .catch(() => this.validator.setException('errorApi', this.parent));
    }
  }

  isErrorNick(response, validElement) {
    this.valid = response.data.status;
    if (this.valid) {
      this.validator.setWarning("login", "nickIsBusy");
      this.errorSlot.nick = true;
    } else if (this.errorSlot.nick && !this.valid) {
      this.validator.cleanLog(validElement, "nickIsBusy");
      this.errorSlot.nick = false;
    }
  }

 

komentarz zamknięcia: Rozwiązanie problemu
1
komentarz 4 listopada 2018 przez ScriptyChris Mędrzec (190,190 p.)
edycja 4 listopada 2018 przez ScriptyChris

Nie jestem pewien czy dobrze rozumiem Twój problem, więc piszę w formie komentarza.

bindMethod(element, func) {

Metoda bindMethod przyjmuje dwa argumenty: element i func. Dlaczego więc jako pierwszy parametr przekazujesz tam funkcję, która przyjmuje event (a we wcześniejszym przypadku posyłasz tam event)?

this.validator.getStore().login.addEventListener("keyup",
   (event) => this.bindMethod((event) => this.isNickBusy(event)));

Chyba this będzie Twoim elementem, albo event.target.

Prędzej zapisałbym to w ten sposób (zakładając, że this się nie "zgubi"):

this.validator.getStore().login.addEventListener("keyup", (event) =>{
     this.bindMethod(event.target, this.isNickBusy); // this.isNickBusy to referencja do metody, którą z kolei metoda bindMethod wywołuje później przekazując parametr element
});

PS. Dedukuję, że w metodzie this.isNickBusy parametr validElement traktowany jest jako event, bo odwołujesz się w if do property target - jesli tak, to nie jest to element ale obiekt zdarzenia, czyli event. Zmień zatem nazwę tam i w metodach, które ją wywołują z tym parametrem żeby było wiadomo, że to nie element DOM tylko obiekt zdarzenia.

komentarz 4 listopada 2018 przez ShiroUmizake Nałogowiec (46,300 p.)
1. Inaczej elementu(eventu) nie widzi. Wiem, też mnie to zdziwiło.
komentarz 4 listopada 2018 przez ScriptyChris Mędrzec (190,190 p.)

Inaczej elementu(eventu) nie widzi

Nie rozumiem.

Próbowałeś sposobu, który zaproponowałem?

komentarz 4 listopada 2018 przez ShiroUmizake Nałogowiec (46,300 p.)
Odpisałem dlaczego tak zrobiłem xd. Jutro przetestuje
komentarz 4 listopada 2018 przez ScriptyChris Mędrzec (190,190 p.)

Element DOM a obiekt zdarzenia to dwa różne obiekty. Choć element DOM może się w zdarzeniu zawierać.

Pokaż wersję kodu, gdzie funkcja nie widzi tego co powinna. Może this się "gubi"?

komentarz 5 listopada 2018 przez ShiroUmizake Nałogowiec (46,300 p.)

Po drobnym fixie (tak jak przewidziałeś miał problemy z this). Twoje rozwiązanie działa trzeba drobną poprawkę zrobić.

    this.validator.getStore().login.addEventListener('keyup',
      (event) => {
        this.bindMethod(event, this.isNickBusy.bind(this));
        this.clearError('login', 'emptyLogin');
      }

  bindMethod(event, func) {
    window.setTimeout(() => func(event), 100);
  }

 

komentarz 5 listopada 2018 przez ScriptyChris Mędrzec (190,190 p.)
Jeśli teraz działa, to możesz zamknąć temat. :)

1 odpowiedź

0 głosów
odpowiedź 4 listopada 2018 przez adrian17 Mentor (354,120 p.)

Um, nie do końca rozumiem problem.

this.validator.getStore().password.addEventListener('keyup',
  (event) => window.setTimeout(event => this.isNickBusy(event), 100);

setTimeout wywołuje funkcję bez parametru `event` - nie ma więc sensu brać go jako parametr.

Coś takiego nie działa?

this.validator.getStore().password.addEventListener('keyup',
  (event) => window.setTimeout(() => this.isNickBusy(event), 100);

 

komentarz 4 listopada 2018 przez Tomek Sochacki Ekspert (227,490 p.)
mi sie wydaje, że błąd tkwi gdzieś w założeniach koncepcyjnych do problemu... te rozwiazania  wszystkie sa wg mnie zbyt ciężkie do klarownego otestowania, a z doswiadczenia wiem, że jeżeli coś jest ciezkie do unit testów to znaczy, że można to zrobić lepiej i prościej... wieczorem postaram sie tez pomyśleć jak znajde chwile
komentarz 4 listopada 2018 przez ShiroUmizake Nałogowiec (46,300 p.)
jutro spróbuje twojego sposobu ;). Ostatecznie będzie pozyskiwał z store, jakoś to już przeżyje.

Podobne pytania

0 głosów
1 odpowiedź 213 wizyt
pytanie zadane 2 maja 2015 w C i C++ przez pulson666 Stary wyjadacz (12,560 p.)
0 głosów
1 odpowiedź 152 wizyt
pytanie zadane 3 października 2018 w JavaScript przez khunum Nowicjusz (190 p.)
+1 głos
1 odpowiedź 396 wizyt
pytanie zadane 28 października 2017 w JavaScript przez lapacz.kornel Mądrala (6,930 p.)

93,456 zapytań

142,451 odpowiedzi

322,721 komentarzy

62,837 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...