# ctx.blockModel

Модель родительского блока (экземпляр BlockModel), в котором находится текущее JS-поле или JS-блок. В сценариях JSField, JSItem, JSColumn `ctx.blockModel` указывает на блок формы или таблицы, содержащий текущую JS-логику. В независимом JSBlock он может быть `null` или совпадать с `ctx.model`.

## Применимые сценарии

| Сценарий | Описание |
|------|------|
| **JSField** | Доступ к `form`, `коллекция` и `resource` родительского блока формы внутри поля формы для реализации связей или валидации. |
| **JSItem** | Доступ к информации о ресурсе и коллекции родительского блока таблицы/формы внутри элемента подтаблицы. |
| **JSColumn** | Доступ к `resource` (например, `getSelectedRows`) и `коллекция` родительского блока таблицы внутри столбца таблицы. |
| **Действия формы / Потоки событий** | Доступ к `form` для валидации перед отправкой, к `resource` для обновления и т. д. |

> Примечание: `ctx.blockModel` доступен только в контекстах RunJS, где существует родительский блок. В независимых JSBlock (без родительской формы или таблицы) он может быть `null`. Перед использованием рекомендуется выполнять проверку на пустое значение.

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

```ts
blockModel: BlockModel | FormBlockModel | TableBlockModel | CollectionBlockModel | DataBlockModel | null;
```

Конкретный тип зависит от типа родительского блока: блоки формы чаще всего являются `FormBlockModel` или `EditFormModel`, блоки таблицы — `TableBlockModel`.

## Общие свойства

| Свойство | Тип | Описание |
|------|------|------|
| `uid` | `string` | Уникальный идентификатор модели блока. |
| `collection` | `Collection` | Коллекция, привязанная к текущему блоку. |
| `resource` | `Resource` | Экземпляр ресурса, используемый блоком (`SingleRecordResource` / `MultiRecordResource` и т. д.). |
| `form` | `FormInstance` | Блок формы: экземпляр формы Ant Design, поддерживающий `getFieldsValue`, `validateFields`, `setFieldsValue` и т. д. |
| `emitter` | `EventEmitter` | Излучатель событий, используемый для прослушивания `formValuesChange`, `onFieldReset` и т. д. |

## Связь с ctx.model и ctx.form

| Потребность | Рекомендуемое использование |
|------|----------|
| **Родительский блок текущего JS** | `ctx.blockModel` |
| **Чтение/запись полей формы** | `ctx.form` (эквивалентно `ctx.blockModel?.form`, удобнее в блоках формы) |
| **Модель текущего контекста выполнения** | `ctx.model` (модель поля в JSField, модель блока в JSBlock) |

В JSField `ctx.model` — это модель поля, а `ctx.blockModel` — блок формы или таблицы, содержащий это поле; `ctx.form` обычно является `ctx.blockModel.form`.

## Примеры

### Таблица: получение выбранных строк и их обработка

```ts
const rows = ctx.blockModel?.resource?.getSelectedRows?.() || [];
if (rows.length === 0) {
  ctx.message.warning('Пожалуйста, сначала выберите данные');
  return;
}
```

### Сценарий формы: валидация и обновление

```ts
if (ctx.blockModel?.form) {
  await ctx.blockModel.form.validateFields();
  await ctx.blockModel.resource?.refresh?.();
}
```

### Прослушивание изменений формы

```ts
ctx.blockModel?.emitter?.on?.('formValuesChange', (payload) => {
  // Реализация связей или повторный рендеринг на основе последних значений формы
});
```

### Принудительный повторный рендеринг блока

```ts
ctx.blockModel?.rerender?.();
```

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

- В **независимом JSBlock** (без родительского блока формы или таблицы) `ctx.blockModel` может быть `null`. При доступе к его свойствам рекомендуется использовать опциональную цепочку: `ctx.blockModel?.resource?.refresh?.()`.
- В **JSField / JSItem / JSColumn** `ctx.blockModel` относится к блоку формы или таблицы, содержащему текущее поле. В **JSBlock** это может быть сам блок или блок верхнего уровня, в зависимости от фактической иерархии.
- `resource` существует только в блоках данных; `form` существует только в блоках формы. Блоки таблиц обычно не имеют `form`.

## Связанные разделы

- [ctx.model](./model.md): Модель текущего контекста выполнения
- [ctx.form](./form.md): Экземпляр формы, часто используется в блоках формы
- [ctx.resource](./resource.md): Экземпляр ресурса (эквивалентно `ctx.blockModel?.resource`, используйте напрямую при наличии)
- [ctx.getModel()](./get-model.md): Получение моделей других блоков по UID