Как создать имя частного канала динамически

Я хотел бы создать систему отслеживания заказов в реальном времени, используя laravel, vue и pusher. В админ-панели у меня есть список всех заказов. Идея заключается в том, что когда администратор изменит статус заказа, пользователь (владелец этого заказа) получит уведомление без обновления страницы. Для этого я хочу использовать частные каналы. Моя проблема заключается в том, чтобы динамически создавать имя частного канала.

Панель администратора выглядит как ниже.

<h1>Admin</h1>
<table>
    @foreach ($orders as $o)
    <tr>
        <td>{{$o->name}}</td>
        <td>{{$o->status}}</td>
        <td>{{$o->getUser->name}}</td>
        <td>
            <update-order-status :id="{{$o->id}}"></update-order-status>
        </td>
    </tr>
    @endforeach
</table>

Существует компонент update-order-status, который используется для изменения статуса заказа. Идентификатор заказа передается компоненту через реквизит. Содержимое компонента выглядит так:

///update-order-status component
<template>
  <div>
    <form method="GET" action="change_status">
      <input type="hidden" name="id" :value=id />
      <select name="status">
              <option value="placed">Placed</option>
               <option value="progres">Progres</option>
               <option value="delivered">Delivered</option>
            </select>
      <input type="submit" value="update status" v-on:click="upd(id)" />
    </form>
  </div>
</template>

<script>
  export default {
    created() {
    },
    props: ["id"],

    data: function() {
      return {


      };
    },

    methods: {
      upd: function(id) {
        this.$root.$emit("eve", id);
      }
    }
  };
</script>

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

///status changed component

<template>
 <div  v-if="sn" class="notification is-primary">
  <button class="delete" v-on:click="del()"></button>
  Staus of order nr {{nr}} has been changed 
</div>
</template>

<script>
export default {
  created() {
    this.$root.$on("eve", data => {
      this.nr = data;
    });
    Echo.private("order" + this.nr).listen("status_changed", e => {
      this.sn = true;
    });
  },
  props: [],

  data: function() {
    return {
      sn: false,
      nr: 0
    };
  },
  methods: {
    del: function() {
      this.sn = false;
    }
  }
};
</script>

Здесь проблема. Переменная nr всегда равна 0. Это не меняется динамически. Когда nr является статическим или канал общедоступен, этот код работает нормально. Пожалуйста помоги.

1 ответ

Положить Echo внутри $on, В противном случае асинхронный $on бывает слишком поздно, чтобы изменить nr в Echo,

  created() {
    this.$root.$on("eve", data => {
      this.nr = data;
      Echo.private("order" + this.nr).listen("status_changed", e => {
        this.sn = true;
      });
    });
  }
Другие вопросы по тегам