# ctx.off()

Удаляет обработчики событий, зарегистрированные через `ctx.on(eventName, handler)`. Часто используется в сочетании с [ctx.on](./on.md) для отписки в подходящий момент, что позволяет избежать утечек памяти или повторных срабатываний.

## Сценарии использования

| Сценарий | Описание |
|------|------|
| **Очистка React useEffect** | Вызывается в функции очистки (cleanup) `useEffect` для удаления слушателей при размонтировании компонента. |
| **JSField / JSEditableField** | Отписка от события `js-field:value-change` при двусторонней привязке данных полей. |
| **Связанное с ресурсами** | Отмена подписки на события `refresh`, `saved` и другие, зарегистрированные через `ctx.resource.on`. |

## Определение типа

```ts
off(eventName: string, handler: (event?: any) => void): void;
```

## Примеры

### Парное использование в React useEffect

```tsx
React.useEffect(() => {
  const handler = (ev) => setValue(ev?.detail ?? '');
  ctx.on('js-field:value-change', handler);
  return () => ctx.off('js-field:value-change', handler);
}, []);
```

### Отписка от событий ресурса

```ts
const handler = () => { /* ... */ };
ctx.resource?.on('refresh', handler);
// В подходящий момент
ctx.resource?.off('refresh', handler);
```

## Примечания

1. **Идентичность ссылки на обработчик**: Обработчик (`handler`), передаваемый в `ctx.off`, должен быть той же самой ссылкой, что и при вызове `ctx.on`, иначе он не будет удален корректно.
2. **Своевременная очистка**: Вызывайте `ctx.off` перед размонтированием компонента или уничтожением контекста, чтобы предотвратить утечки памяти.

## Связанная документация

- [ctx.on](./on.md) — Подписка на события
- [ctx.resource](./resource.md) — Экземпляр ресурса и его методы `on`/`off`