Есть ли способ защитить переходы внутри узлов иерархического состояния в xState

Как следует из названия, у меня есть защищенные переходы, которые я хотел разместить в узле иерархического состояния, однако кажется, что xState не может прочитать свойство охранников и возвращает «TypeError: Cannot read property 'propertyName' of undefined" error»

Есть ли способ сделать это в xState, или в этом случае мне следует действовать без иерархического узла состояния?


person Giorgi Guledani    schedule 28.01.2020    source источник
comment
Попробуйте задать этот вопрос в сообществе XState spectrum.chat/statecharts?tab=posts.   -  person Vladimir Nabokov    schedule 28.01.2020


Ответы (2)


Я использовал иерархический конечный автомат пример из документации, чтобы попытаться смоделировать это, добавив в конец примера следующее:

    on: {
      POWER_OUTAGE: '.red.blinking',
      POWER_RESTORED: '.red',
      POWER_TEST: {
        target: '.red.stop',
        cond: {
          type: 'test'
        }
      }
    }
  },{
    guards: {
      test: () => true
    }
  });

Кажется, это работает, как и ожидалось, вы можете попробовать эту машину и пример защиты в визуализаторе здесь

Вы можете перевернуть логическое значение в тестовой защите, чтобы поиграть с ним, работающим/не работающим.

А вот полный код примера для справки:

const pedestrianStates = {
    initial: 'walk',
    states: {
      walk: {
        on: {
          PED_COUNTDOWN: 'wait'
        }
      },
      wait: {
        on: {
          PED_COUNTDOWN: 'stop'
        }
      },
      stop: {},
      blinking: {}
    }
  };

  const lightMachine = Machine({
    key: 'light',
    initial: 'green',
    states: {
      green: {
        on: {
          TIMER: 'yellow'
        }
      },
      yellow: {
        on: {
          TIMER: 'red'
        }
      },
      red: {
        on: {
          TIMER: {
            target: 'green',
            cond: {
              type: 'searchValid'
            }
          }
        },
        ...pedestrianStates
      }
    },
    on: {
      POWER_OUTAGE: '.red.blinking',
      POWER_RESTORED: '.red',
      POWER_TEST: {
        target: '.red.stop',
        cond: {
          type: 'test'
        }
      }
    }
  },{
    guards: {
      test: () => true
    }
  });
person TameBadger    schedule 29.01.2020
comment
Большое спасибо за ответ. К сожалению, я пытаюсь иметь охранников в иерархическом состоянии. в то время как в вашем примере есть охранники за его пределами. Я должен был быть более описательным. Прости за это. - person Giorgi Guledani; 30.01.2020

Итак, проблема, с которой я столкнулся, заключалась в том, что контекст был назначен моей иерархической машине состояний, а не родительской машине, поэтому охранники не могли получить к ней доступ. Перемещение контекста на родительский компьютер решило проблему

person Giorgi Guledani    schedule 30.01.2020