Проблема с мутациями vuedraggable и apollo - PullRequest
0 голосов
/ 19 июня 2020

В моем проекте я использую Django - graphene-django (graphQL) - Apollo - VueJS - Vuetify, а для задач перетаскивания я пытаюсь использовать Vuedraggable. На самом деле я пытаюсь создать доску kanban со столбцами и карточками для перехода от столбца к столбцу (как в Trello). Дело в том, что он хорошо работает, когда я не запускаю мутацию Apollo.

Итак, вы можете увидеть мое исходное состояние:

enter image description here

Если я ничего не делаю, кроме :list и group='...', это работает:

enter image description here

Но когда я предоставляю @change="..." метод с мутацией apollo, он больше не работает и делает следующее:

enter image description here

Мои данные структурированы следующим образом:

Есть несколько этапов (New, In Progress, Done), и каждый из них может иметь несколько билетов (Stage 1-n Tickets)

stage {
  id
  name
  ticketIds {
    id
    name
  }
}

Вот мои источники:

Мой шаблон (я опустил чисто визуальные элементы, такие как классы стилей и заголовок столбца, чтобы сделать его более чистым):

<template>
  <v-row>
    <v-col
      v-for="stage in helpdeskTicketStages"
      :key="stage.id">
      <draggable
        :list="stage.ticketIds"
        @change="changeTicketStage($event, stage)"
        group="tickets">
        <v-card
          v-for="ticket in stage.ticketIds"
          :key="ticket.id">
          <v-card-title>{{ ticket.name }}</v-card-title>
        </v-card>
      </draggable>
    </v-col>
  </v-row>
</template>

Мой change метод:

changeTicketStage (event, stage) {
  if (event.added) {
    this.$apollo.mutate({
      mutation: CHANGE_HELPDESK_TICKET_STAGE_MUTATION,
      variables: {
        ticketId: event.added.element.id,
        stageId: stage.id
      },
      update: (cache, { data: { changeHelpdeskTicketStage } }) => {
        console.log('cache : ', cache)
      }
    })
  }
}

Мутация CHANGE_HELPDESK_TICKET_STAGE_MUTATION:

const CHANGE_HELPDESK_TICKET_STAGE_MUTATION = gql`
  mutation changeHelpdeskTicketStageMutation (
    $ticketId: ID!,
    $stageId: ID!
  ) {
    changeHelpdeskTicketStage (
      ticketId: $ticketId,
      stageId: $stageId
    ) {
      id,
      isClosed,
      stageId {
        id
        name
      }
    }
  }
`

Графен- django, который называется:

class ChangeHelpdeskTicketStage(graphene.Mutation):

    class Arguments:
        ticket_id = graphene.ID()
        stage_id = graphene.ID()

    class Meta:
        output = HelpdeskTicketType

    def mutate(self, info, **kwargs):
        ticket = get_object_or_404(HelpdeskTicket, id=kwargs['ticket_id'])
        stage = get_object_or_404(HelpdeskTicketStage, id=kwargs['stage_id'])
        ticket.change_stage(stage)
        return ticket

Странно то, что без мутации, он движется правильно. И когда я добавляю мутацию, чтобы эффективно изменить ее и в БД (что сделано правильно), он делает этот странный «клон». Я думаю, что проблема в кэше apollo, потому что, когда я печатаю что-то на консоли, в методе change(...) все в порядке:

Действительно, в конце метода change(...) я запускаю:

  for (const stage of this.helpdeskTicketStages) {
    console.log('name:', stage.name, 'tickets:', stage.ticketIds)
  }

, что выдает на консоль:

enter image description here

Итак, мы видим, что это правильно, есть 1 билет на этап. Но он отображает 2 билета на стадии «Новый»!

Я добавил кнопку тестирования для запуска того же кода:

test () {
  console.log('----------------- TEST -----------------')
  for (const stage of this.helpdeskTicketStages) {
    console.log('name:', stage.name, 'tickets:', stage.ticketIds)
  }
  console.log('----------------- END -----------------')
}

И когда мы проверяем результат в консоли, мы можно увидеть:

enter image description here

Что есть 2 билета на этапе «Новый» и 1 билет на этапе «В процессе», тогда как он должен быть по 1 на каждом этапе. ... Конечно, если я нажму F5, он выполнит запрос и получит правильную информацию в БД и исправит отображение.

Также в этой части:

      update: (cache, { data: { changeHelpdeskTicketStage } }) => {
        console.log('cache : ', cache)
      }

Если я проверю cache, мы также можем видеть, что их 2 в «Новом» и 1 в «В процессе».

Может кто-нибудь сказать мне, почему он делает это? Я имею в виду, что когда мутации нет, списки меняются правильно. Мутация должна присутствовать только для того, чтобы эффективно изменить ее в БД.

Заранее спасибо!

1 Ответ

0 голосов
/ 19 июня 2020

Ну, я наконец передумал и решил perform the mutation on the STAGE instead of doing this on the TICKET, чтобы я мог отправить исходный этап и целевой этап с их обновленным списком билетов в результате мутации. Написав все вопросы, я понял, что так будет проще ...

Действительно, результат мутации следующий: [source_stage, target_stage], поэтому тип вывода теперь - graphene.List ( my_type ).

Делая это, мне не нужно вручную изменять stage ticketIds вручную после мутации в операторе update, поскольку он обновляется сам по себе правильно.

...