Laravel Livewire: как принудительно обновить вычисленное свойство (и DOM)?

У меня есть любимый компонент. Этот компонент рисует звезду, которая получает три класса в зависимости от состояния. Чтобы выбрать, какой класс применить к компоненту, я использую вычисляемое свойство, определенное как:

  public function getEsFavoritaProperty() {
    return $this->idea->users()->where('user_id', Auth::user()->id)->count() > 0;
  }

  public function getFavoritaProperty() {

    if (Auth::guest()) return 'voto-idea-inactivo';

    if ($this->EsFavorita) {
      return 'voto-idea-seleccionado';
    } else {
      return 'voto-idea-activo';
    }
  }

Это испанский язык, но я думаю, что логика ясна: если нет подписанного пользователя (гостя), тогда функция вернет класс voto-idea-inactivo, если пользователь вошел в систему, он вернет тот или иной на основе функции, которая спрашивает, добавлен ли текущий элемент в избранное. текущим пользователем.

Эти две функции работают должным образом. Если я изменяю данные в сводной таблице прямо в базе данных, звездочка показывает состояние правильно.

Теперь у меня есть этот якорь <a> в звезде ...

<a wire:click.prevent="toggleFavorita">
    <i class="fas fa-star fa-2x {{ $this->favorita }}"></i>
</a>

поэтому он переключает (прикрепляет / отключает) отношения, функция:

  public function toggleFavorita() {
    if ($this->EsFavorita) {
      $this->idea->users()->detach(Auth::user()->id);
    } else {
      $this->idea->users()->attach(Auth::user()->id);
    }
  }

Этот также отлично работает, если пользователь нажимает на звездочку, функция создает или удаляет отношение в базе данных, как и должно. Проблема в том, что звезда не перерисовывается, а сохраняет прежнее состояние. Если я перезагружу страницу, изменения появятся.

Итак, как мне заставить эту звезду обновиться с новым вычисленным значением?


person luisfer    schedule 08.10.2020    source источник
comment
Спасибо. Как мне вызвать функцию ?. Я поместил $this->render() сразу после обновления базы данных (в функции toggleFavorita()), но это не работает   -  person luisfer    schedule 08.10.2020
comment
Эммм это странно, мне нужно дважды щелкнуть, и конечно показывает ПРЕДЫДУЩЕЕ состояние. Я имею в виду, его выключено, я щелкаю ... остается выключенным. Я проверяю базу данных, и там связь, я снова щелкаю, это продолжается, но база данных больше не имеет отношения ????   -  person luisfer    schedule 08.10.2020
comment
Это дало мне ошибку: Public method [toggleFavorita;$refresh] not found on component: [show-idea]   -  person luisfer    schedule 08.10.2020
comment
$this->render(); должно работать   -  person Kamlesh Paul    schedule 08.10.2020
comment
Нет ... Пробовал, тоже не работает. Я поместил $refresh на отдельную кнопку, и она работает, но немного глупо нажимать на звездочку, а затем на другую кнопку. Я позвонил toggleFavorita(); $refresh по кнопке, но она тоже не работает   -  person luisfer    schedule 08.10.2020


Ответы (1)


Я решил проблему ... не имел никакого отношения к обновлению компонента ????????‍♂️

Дело в том, что ... в вычисляемом свойстве toggleFavorita я пытался получить доступ к другому свойству, в данном случае EsFavorita, определенному getEsFavoritaAttribute()

Что я сделал, так это изменил эту функцию из вычисляемого свойства на обычную функцию, а затем вызвал эту функцию как так ... поэтому измененный код теперь выглядит так:

public function EsFavorita() {
    return $this->idea->users()->where('user_id', Auth::user()->id)->count() > 0;
}

public function toggleFavorita() {
    if ($this->EsFavorita()) {
        $this->idea->users()->detach(Auth::user()->id);
    } else {
        $this->idea->users()->attach(Auth::user()->id);
    }
}

Я не знаю, похоже на жизненный цикл, что вычисленные свойства обновляются ПОСЛЕ всего остального. Мне потребовалось много времени и много Log::info(), чтобы понять это

person luisfer    schedule 08.10.2020