ctx.openView()

Mở view chỉ định (drawer, popup, embedded page, v.v.) bằng cách lập trình. Được cung cấp bởi FlowModelContext, dùng để mở view ChildPage hoặc PopupAction đã được cấu hình trong các kịch bản như JSBlock, ô của table, luồng sự kiện.

Kịch bản áp dụng

Kịch bảnMô tả
JSBlockSau khi click button mở popup chi tiết/chỉnh sửa, truyền filterByTk của hàng hiện tại
Ô của tableRender button trong ô, click để mở popup chi tiết của hàng
Luồng sự kiện / JSActionMở view hoặc popup tiếp theo sau khi thao tác thành công
Field quan hệMở popup lựa chọn/chỉnh sửa qua ctx.runAction('openView', params)

Lưu ý: ctx.openView cần khả dụng trong môi trường RunJS có ngữ cảnh FlowModel; nếu model tương ứng với uid không tồn tại, sẽ tự động tạo PopupActionModel và lưu trữ.

Chữ ký

openView(uid: string, options?: OpenViewOptions): Promise<void>

Giải thích tham số

uid

Định danh duy nhất của model view. Nếu không tồn tại sẽ tự động tạo và lưu. Khuyến nghị sử dụng UID ổn định, như ${ctx.model.uid}-detail, để tái sử dụng cấu hình khi mở popup nhiều lần.

Trường options thường dùng

TrườngKiểuMô tả
modedrawer / dialog / embedCách mở: drawer, popup, embedded, mặc định drawer
sizesmall / medium / largeKích thước popup/drawer, mặc định medium
titlestringTiêu đề view
paramsRecord<string, any>Tham số bất kỳ truyền cho view
filterByTkanyGiá trị primary key, dùng cho kịch bản chi tiết/chỉnh sửa bản ghi đơn
sourceIdstringID bản ghi nguồn, dùng cho kịch bản quan hệ
dataSourceKeystringData source
collectionNamestringTên collection
associationNamestringTên field quan hệ
navigationbooleanCó sử dụng route navigation hay không, khi truyền defineProperties / defineMethods sẽ bị buộc đặt thành false
preventClosebooleanCó ngăn đóng hay không
definePropertiesRecord<string, PropertyOptions>Inject động thuộc tính vào model trong view
defineMethodsRecord<string, Function>Inject động phương thức vào model trong view

Ví dụ

Cách dùng cơ bản: mở drawer

const popupUid = `${ctx.model.uid}-detail`;
await ctx.openView(popupUid, {
  mode: 'drawer',
  size: 'medium',
  title: ctx.t('详情'),
});

Truyền ngữ cảnh hàng hiện tại

const primaryKey = ctx.collection?.primaryKey || 'id';
await ctx.openView(`${ctx.model.uid}-1`, {
  mode: 'dialog',
  title: ctx.t('行详情'),
  params: {
    filterByTk: ctx.record?.[primaryKey],
    record: ctx.record,
  },
});

Mở qua runAction

Khi model được cấu hình action openView (như field quan hệ, field có thể click), có thể gọi:

await ctx.runAction('openView', {
  navigation: false,
  mode: 'dialog',
  collectionName: 'users',
  filterByTk: ctx.record?.id,
});

Inject ngữ cảnh tùy chỉnh

await ctx.openView(`${ctx.model.uid}-edit`, {
  mode: 'drawer',
  filterByTk: ctx.record?.id,
  defineProperties: {
    onSaved: {
      get: () => () => ctx.resource?.refresh?.(),
      cache: false,
    },
  },
});

Quan hệ với ctx.viewer, ctx.view

Mục đíchCách dùng khuyến nghị
Mở view flow đã cấu hìnhctx.openView(uid, options)
Mở content tùy chỉnh (không có flow)ctx.viewer.dialog() / ctx.viewer.drawer()
Thao tác view đang mở hiện tạictx.view.close(), ctx.view.inputArgs

ctx.openView mở FlowPage (ChildPageModel), nội bộ render page flow đầy đủ; ctx.viewer mở nội dung React bất kỳ.

Lưu ý

  • Khuyến nghị uid liên kết với ctx.model.uid (như ${ctx.model.uid}-xxx), tránh xung đột giữa nhiều block
  • Khi truyền defineProperties / defineMethods, navigation sẽ bị buộc đặt thành false để tránh mất ngữ cảnh sau khi refresh
  • ctx.view trong popup trỏ đến instance view hiện tại, ctx.view.inputArgs có thể đọc tham số được truyền khi mở

Liên quan

  • ctx.view: Instance view đang mở hiện tại
  • ctx.model: Model hiện tại, dùng để xây dựng popupUid ổn định