Skip to content

fix: fix CustomComboBox modelData undefined errors#3107

Closed
robertkill wants to merge 1 commit intolinuxdeepin:masterfrom
robertkill:master
Closed

fix: fix CustomComboBox modelData undefined errors#3107
robertkill wants to merge 1 commit intolinuxdeepin:masterfrom
robertkill:master

Conversation

@robertkill
Copy link
Copy Markdown
Contributor

@robertkill robertkill commented Mar 20, 2026

  1. Added safeModelData property to handle undefined modelData in both personalization and power plugins
  2. Fixed text property to handle null safeModelData by providing empty string fallback
  3. Fixed icon.name, enabled, and visible properties to use safeModelData instead of direct modelData access
  4. In power plugin, replaced D.ToolTip with ToolTip attached property for better integration
  5. Added QtQuick.Controls import for ToolTip support in power plugin

Log: Fixed combobox display issues when modelData is undefined

Influence:

  1. Test comboboxes in personalization settings with various model types
  2. Verify combobox items display correctly when modelData is undefined
  3. Test tooltip functionality in power settings comboboxes
  4. Verify icon display, enabled state, and visibility work properly with safeModelData
  5. Test combobox behavior with both array and object-based models

fix: 修复 CustomComboBox 中 modelData 未定义错误

  1. 在个性化和电源插件中添加 safeModelData 属性来处理未定义的 modelData
  2. 修复 text 属性,当 safeModelData 为 null 时提供空字符串回退
  3. 修复 icon.name、enabled 和 visible 属性,使用 safeModelData 替代直接 访问 modelData
  4. 在电源插件中,将 D.ToolTip 替换为 ToolTip 附加属性以获得更好的集成
  5. 为电源插件添加 QtQuick.Controls 导入以支持 ToolTip

Log: 修复了当 modelData 未定义时的组合框显示问题

Influence:

  1. 测试个性化设置中的组合框,使用不同类型的模型
  2. 验证当 modelData 未定义时组合框项目是否正确显示
  3. 测试电源设置中组合框的工具提示功能
  4. 验证图标显示、启用状态和可见性在使用 safeModelData 时正常工作
  5. 测试组合框在数组和基于对象的模型下的行为

Summary by Sourcery

Handle undefined modelData in CustomComboBox delegates to prevent display errors and improve tooltip integration in power and personalization plugins.

Bug Fixes:

  • Prevent CustomComboBox text and related properties from accessing undefined modelData in personalization and power plugins, avoiding runtime errors and blank items.

Enhancements:

  • Add a safeModelData wrapper in CustomComboBox delegates to provide fallbacks for text, icon, enabled, and visible bindings when modelData is missing or null.
  • Switch power plugin combo box tooltips to use the standard ToolTip attached property from QtQuick.Controls for better integration and behavior.

@deepin-ci-robot
Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: robertkill

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@sourcery-ai
Copy link
Copy Markdown

sourcery-ai Bot commented Mar 20, 2026

Reviewer's guide (collapsed on small PRs)

Reviewer's Guide

CustomComboBox delegates in both power and personalization plugins now guard against undefined modelData via a safeModelData helper, provide empty-string fallbacks for text, use safeModelData for icon/enabled/visible role resolution, and switch the power plugin tooltip to the QtQuick.Controls attached ToolTip API with the necessary import.

Sequence diagram for power plugin tooltip behavior with attached ToolTip

sequenceDiagram
  actor User
  participant CustomComboBox
  participant MenuItem
  participant HoverHandler
  participant ToolTip

  User->>CustomComboBox: Open_popup
  CustomComboBox->>MenuItem: Create_delegate_instances

  User->>MenuItem: Move_mouse_over_item
  MenuItem->>HoverHandler: Update_hover_state
  HoverHandler-->>MenuItem: hovered_true

  MenuItem->>MenuItem: Compute_fontMetrics_and_availableTextWidth
  MenuItem->>ToolTip: Evaluate_visible_binding
  ToolTip-->>ToolTip: visible_true_when_hovered_and_text_truncated

  User->>MenuItem: Keep_mouse_over_item
  ToolTip-->>User: Display_full_item_text

  User->>MenuItem: Move_mouse_away
  MenuItem->>HoverHandler: Update_hover_state
  HoverHandler-->>MenuItem: hovered_false
  MenuItem->>ToolTip: Reevaluate_visible_binding
  ToolTip-->>ToolTip: visible_false
Loading

File-Level Changes

Change Details Files
Introduce safeModelData helper in CustomComboBox delegates to handle undefined modelData and adjust bindings accordingly.
  • Add readonly safeModelData property on D.MenuItem delegates, defaulting to modelData when defined or null otherwise.
  • Update text bindings to use safeModelData for role access and fall back to an empty string when safeModelData is null.
  • Refactor icon.name, enabled, and visible bindings in the personalization plugin to use safeModelData as the fallback source instead of modelData.
src/plugin-power/qml/CustomComboBox.qml
src/plugin-personalization/qml/CustomComboBox.qml
Align tooltip implementation in the power plugin CustomComboBox with QtQuick.Controls ToolTip attached properties.
  • Add QtQuick.Controls import to support ToolTip attached properties.
  • Replace inline D.ToolTip object with ToolTip.visible and ToolTip.text attached property bindings driven by the HoverHandler and text metrics.
src/plugin-power/qml/CustomComboBox.qml

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@deepin-ci-robot
Copy link
Copy Markdown

deepin pr auto review

代码审查报告

1. 语法逻辑

改进点:

  1. safeModelData 的处理逻辑

    • 问题:在 src/plugin-personalization/qml/CustomComboBox.qml 中,当 modelDataundefined 时,safeModelData 被赋值为 null。但在后续的 text 属性绑定中,如果 safeModelDatanull,访问 safeModelData[control.textRole] 会导致运行时错误(尝试读取 null 的属性)。
    • 建议:在访问 safeModelData 的属性前,应先检查 safeModelData 是否为 nullundefined
    • 修改示例
      text: control.textRole 
          ? (Array.isArray(control.model) 
              ? (safeModelData ? safeModelData[control.textRole] : "") 
              : (model[control.textRole] === undefined 
                  ? (safeModelData ? safeModelData[control.textRole] : "") 
                  : model[control.textRole])) 
          : (safeModelData !== null ? safeModelData : "")
  2. ToolTip 的直接使用

    • 问题:在 src/plugin-power/qml/CustomComboBox.qml 中,直接使用 ToolTip.visibleToolTip.text 可能会导致作用域混淆,因为 ToolTipQtQuick.Controls 中的附加属性。
    • 建议:明确使用 ToolTip 作为附加属性,并确保其作用域正确。
    • 修改示例
      ToolTip.visible: hoverHandler.hovered && fontMetrics.advanceWidth(menuItem.text) > menuItem.availableTextWidth
      ToolTip.text: menuItem.text

2. 代码质量

改进点:

  1. 代码重复

    • 问题safeModelData 的定义和使用逻辑在两个文件中重复。
    • 建议:将 safeModelData 的逻辑封装为一个可复用的组件或函数,减少重复代码。
    • 修改示例
      // 定义一个通用函数
      function getSafeModelData(modelData, role) {
          return (typeof modelData !== "undefined" && modelData !== null && role) ? modelData[role] : "";
      }
      
      // 使用示例
      text: control.textRole 
          ? (Array.isArray(control.model) 
              ? getSafeModelData(safeModelData, control.textRole) 
              : (model[control.textRole] === undefined 
                  ? getSafeModelData(safeModelData, control.textRole) 
                  : model[control.textRole])) 
          : (safeModelData !== null ? safeModelData : "")
  2. 可读性

    • 问题text 属性的绑定逻辑过于复杂,嵌套三元运算符较多,难以维护。
    • 建议:将复杂的逻辑拆分为多个中间变量或函数,提高可读性。
    • 修改示例
      readonly property var textRoleValue: control.textRole 
          ? (Array.isArray(control.model) 
              ? (safeModelData ? safeModelData[control.textRole] : "") 
              : (model[control.textRole] === undefined 
                  ? (safeModelData ? safeModelData[control.textRole] : "") 
                  : model[control.textRole])) 
          : (safeModelData !== null ? safeModelData : "")
      
      text: textRoleValue

3. 代码性能

改进点:

  1. 频繁的类型检查

    • 问题Array.isArray(control.model)typeof modelData !== "undefined" 在每次属性绑定时都会执行,可能影响性能。
    • 建议:将 control.model 的类型检查结果缓存为一个只读属性。
    • 修改示例
      readonly property bool isModelArray: Array.isArray(control.model)
      readonly property bool isModelDataDefined: typeof modelData !== "undefined"
      
      // 使用缓存值
      text: control.textRole 
          ? (isModelArray 
              ? (safeModelData ? safeModelData[control.textRole] : "") 
              : (model[control.textRole] === undefined 
                  ? (safeModelData ? safeModelData[control.textRole] : "") 
                  : model[control.textRole])) 
          : (safeModelData !== null ? safeModelData : "")
  2. 属性绑定的优化

    • 问题texticon.name 的绑定逻辑较为复杂,可能导致不必要的重新计算。
    • 建议:将逻辑拆分为多个绑定,减少单个绑定的计算量。
    • 修改示例
      readonly property var textRoleValue: control.textRole 
          ? (isModelArray 
              ? (safeModelData ? safeModelData[control.textRole] : "") 
              : (model[control.textRole] === undefined 
                  ? (safeModelData ? safeModelData[control.textRole] : "") 
                  : model[control.textRole])) 
          : (safeModelData !== null ? safeModelData : "")
      
      text: textRoleValue
      icon.name: control.iconNameRole 
          ? (model[control.iconNameRole] !== undefined 
              ? model[control.iconNameRole] 
              : (safeModelData ? safeModelData[control.iconNameRole] : null)) 
          : null

4. 代码安全

改进点:

  1. modelData 的安全性

    • 问题:直接访问 modelData 的属性可能导致运行时错误(如 modelDatanullundefined)。
    • 建议:始终检查 modelData 是否为 nullundefined 后再访问其属性。
    • 修改示例
      readonly property var safeModelData: typeof modelData !== "undefined" ? modelData : null
      
      // 使用示例
      text: safeModelData ? safeModelData[control.textRole] : ""
  2. ToolTip 的安全性

    • 问题ToolTip 的绑定逻辑依赖于 hoverHandler.hoveredfontMetrics.advanceWidth(menuItem.text),如果 hoverHandlerfontMetrics 未正确初始化,可能导致错误。
    • 建议:确保 hoverHandlerfontMetrics 在使用前已正确初始化。
    • 修改示例
      ToolTip.visible: hoverHandler && hoverHandler.hovered && fontMetrics && fontMetrics.advanceWidth(menuItem.text) > menuItem.availableTextWidth
      ToolTip.text: menuItem.text || ""

总结

  • 语法逻辑:修复 safeModelDatanull 时的属性访问问题,明确 ToolTip 的作用域。
  • 代码质量:减少重复代码,拆分复杂逻辑,提高可读性。
  • 代码性能:缓存类型检查结果,优化属性绑定。
  • 代码安全:确保 modelDataToolTip 的安全性。

以上修改可以显著提升代码的健壮性、可读性和性能。

Copy link
Copy Markdown

@sourcery-ai sourcery-ai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 3 issues, and left some high level feedback:

  • The new safeModelData can still be null when modelData is undefined, but you then access safeModelData[role] (e.g., in text, icon.name, enabled, visible), which will throw at runtime; consider guarding with safeModelData && safeModelData[role] or defaulting safeModelData to an empty object instead of null when property access is needed.
  • In the power plugin CustomComboBox delegate you removed width: parent.width; unless this is intentional for layout changes, you may want to keep an explicit width binding to avoid the menu items shrinking to their implicit width.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The new `safeModelData` can still be `null` when `modelData` is undefined, but you then access `safeModelData[role]` (e.g., in `text`, `icon.name`, `enabled`, `visible`), which will throw at runtime; consider guarding with `safeModelData && safeModelData[role]` or defaulting `safeModelData` to an empty object instead of `null` when property access is needed.
- In the power plugin `CustomComboBox` delegate you removed `width: parent.width`; unless this is intentional for layout changes, you may want to keep an explicit width binding to avoid the menu items shrinking to their implicit width.

## Individual Comments

### Comment 1
<location path="src/plugin-power/qml/CustomComboBox.qml" line_range="20" />
<code_context>
-        text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
+        readonly property var safeModelData: typeof modelData !== "undefined" ? modelData : null
+        
+        text: control.textRole ? (Array.isArray(control.model) ? safeModelData[control.textRole] : model[control.textRole]) : (safeModelData !== null ? safeModelData : "")
         icon.name: (control.iconNameRole && model[control.iconNameRole] !== undefined) ? model[control.iconNameRole] : null
         highlighted: control.highlightedIndex === index
</code_context>
<issue_to_address>
**issue (bug_risk):** Guard against `safeModelData` being null before indexing into it.

If `Array.isArray(control.model)` is true while `typeof modelData === "undefined"`, `safeModelData` will be `null`, so `safeModelData[control.textRole]` will throw at runtime. You can guard the array branch similarly, for example:

```qml
text: control.textRole
      ? (Array.isArray(control.model)
            ? (safeModelData ? safeModelData[control.textRole] : "")
            : model[control.textRole])
      : (safeModelData !== null ? safeModelData : "")
```
so the new safety behavior applies to both object and array models.
</issue_to_address>

### Comment 2
<location path="src/plugin-personalization/qml/CustomComboBox.qml" line_range="16" />
<code_context>
         useIndicatorPadding: true
-        text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : (model[control.textRole] === undefined ? modelData[control.textRole] : model[control.textRole])) : modelData
-        icon.name: control.iconNameRole ? ((model[control.iconNameRole] !== undefined ? model[control.iconNameRole] : modelData[control.iconNameRole])) : null
+        text: control.textRole ? (Array.isArray(control.model) ? safeModelData[control.textRole] : (model[control.textRole] === undefined ? safeModelData[control.textRole] : model[control.textRole])) : (safeModelData !== null ? safeModelData : "")
+        icon.name: control.iconNameRole ? ((model[control.iconNameRole] !== undefined ? model[control.iconNameRole] : safeModelData[control.iconNameRole])) : null
         highlighted: control.highlightedIndex === index
</code_context>
<issue_to_address>
**issue (bug_risk):** Handle the case where `safeModelData` is null in all branches before indexing.

When `modelData` is undefined, `safeModelData` is `null`, but the code still does `safeModelData[control.textRole]` in both branches, which will throw at runtime. Please guard all indexing with a null check on `safeModelData`, e.g.:

```qml
text: control.textRole
      ? (Array.isArray(control.model)
            ? (safeModelData ? safeModelData[control.textRole] : "")
            : (model[control.textRole] === undefined
                  ? (safeModelData ? safeModelData[control.textRole] : "")
                  : model[control.textRole]))
      : (safeModelData !== null ? safeModelData : "")
```

and apply a similar check wherever `safeModelData[...]` is used.
</issue_to_address>

### Comment 3
<location path="src/plugin-personalization/qml/CustomComboBox.qml" line_range="17" />
<code_context>
-        text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : (model[control.textRole] === undefined ? modelData[control.textRole] : model[control.textRole])) : modelData
-        icon.name: control.iconNameRole ? ((model[control.iconNameRole] !== undefined ? model[control.iconNameRole] : modelData[control.iconNameRole])) : null
+        text: control.textRole ? (Array.isArray(control.model) ? safeModelData[control.textRole] : (model[control.textRole] === undefined ? safeModelData[control.textRole] : model[control.textRole])) : (safeModelData !== null ? safeModelData : "")
+        icon.name: control.iconNameRole ? ((model[control.iconNameRole] !== undefined ? model[control.iconNameRole] : safeModelData[control.iconNameRole])) : null
         highlighted: control.highlightedIndex === index
         hoverEnabled: control.hoverEnabled
</code_context>
<issue_to_address>
**issue (bug_risk):** Avoid indexing `safeModelData` for icon role when it may be null.

When `modelData` is undefined, `safeModelData` is `null`, but the `icon.name` fallback still indexes into it, which can cause a runtime error. Use a null-safe access, e.g.:

```qml
icon.name: control.iconNameRole
           ? (model[control.iconNameRole] !== undefined
                 ? model[control.iconNameRole]
                 : (safeModelData ? safeModelData[control.iconNameRole] : null))
           : null
```
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
readonly property var safeModelData: typeof modelData !== "undefined" ? modelData : null

text: control.textRole ? (Array.isArray(control.model) ? safeModelData[control.textRole] : model[control.textRole]) : (safeModelData !== null ? safeModelData : "")
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (bug_risk): Guard against safeModelData being null before indexing into it.

If Array.isArray(control.model) is true while typeof modelData === "undefined", safeModelData will be null, so safeModelData[control.textRole] will throw at runtime. You can guard the array branch similarly, for example:

text: control.textRole
      ? (Array.isArray(control.model)
            ? (safeModelData ? safeModelData[control.textRole] : "")
            : model[control.textRole])
      : (safeModelData !== null ? safeModelData : "")

so the new safety behavior applies to both object and array models.

useIndicatorPadding: true
text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : (model[control.textRole] === undefined ? modelData[control.textRole] : model[control.textRole])) : modelData
icon.name: control.iconNameRole ? ((model[control.iconNameRole] !== undefined ? model[control.iconNameRole] : modelData[control.iconNameRole])) : null
text: control.textRole ? (Array.isArray(control.model) ? safeModelData[control.textRole] : (model[control.textRole] === undefined ? safeModelData[control.textRole] : model[control.textRole])) : (safeModelData !== null ? safeModelData : "")
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (bug_risk): Handle the case where safeModelData is null in all branches before indexing.

When modelData is undefined, safeModelData is null, but the code still does safeModelData[control.textRole] in both branches, which will throw at runtime. Please guard all indexing with a null check on safeModelData, e.g.:

text: control.textRole
      ? (Array.isArray(control.model)
            ? (safeModelData ? safeModelData[control.textRole] : "")
            : (model[control.textRole] === undefined
                  ? (safeModelData ? safeModelData[control.textRole] : "")
                  : model[control.textRole]))
      : (safeModelData !== null ? safeModelData : "")

and apply a similar check wherever safeModelData[...] is used.

text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : (model[control.textRole] === undefined ? modelData[control.textRole] : model[control.textRole])) : modelData
icon.name: control.iconNameRole ? ((model[control.iconNameRole] !== undefined ? model[control.iconNameRole] : modelData[control.iconNameRole])) : null
text: control.textRole ? (Array.isArray(control.model) ? safeModelData[control.textRole] : (model[control.textRole] === undefined ? safeModelData[control.textRole] : model[control.textRole])) : (safeModelData !== null ? safeModelData : "")
icon.name: control.iconNameRole ? ((model[control.iconNameRole] !== undefined ? model[control.iconNameRole] : safeModelData[control.iconNameRole])) : null
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (bug_risk): Avoid indexing safeModelData for icon role when it may be null.

When modelData is undefined, safeModelData is null, but the icon.name fallback still indexes into it, which can cause a runtime error. Use a null-safe access, e.g.:

icon.name: control.iconNameRole
           ? (model[control.iconNameRole] !== undefined
                 ? model[control.iconNameRole]
                 : (safeModelData ? safeModelData[control.iconNameRole] : null))
           : null

visible: hoverHandler.hovered && fontMetrics.advanceWidth(menuItem.text) > menuItem.availableTextWidth
text: menuItem.text
}
ToolTip.visible: hoverHandler.hovered && fontMetrics.advanceWidth(menuItem.text) > menuItem.availableTextWidth
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个应该没啥区别吧,最终用的应该还是dtk的tooltip,

useIndicatorPadding: true
width: parent.width
text: control.textRole ? (Array.isArray(control.model) ? modelData[control.textRole] : model[control.textRole]) : modelData
readonly property var safeModelData: typeof modelData !== "undefined" ? modelData : null
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个效果是一样的吧,undefined和null,
是不是下面应该去判断modelData有没有效,

1. Added safeModelData property to handle undefined modelData in both
personalization and power plugins
2. Fixed text property to handle null safeModelData by providing empty
string fallback
3. Fixed icon.name, enabled, and visible properties to use safeModelData
instead of direct modelData access
4. In power plugin, replaced D.ToolTip with ToolTip attached property
for better integration
5. Added QtQuick.Controls import for ToolTip support in power plugin

Log: Fixed combobox display issues when modelData is undefined

Influence:
1. Test comboboxes in personalization settings with various model types
2. Verify combobox items display correctly when modelData is undefined
3. Test tooltip functionality in power settings comboboxes
4. Verify icon display, enabled state, and visibility work properly
with safeModelData
5. Test combobox behavior with both array and object-based models

fix: 修复 CustomComboBox 中 modelData 未定义错误

1. 在个性化和电源插件中添加 safeModelData 属性来处理未定义的 modelData
2. 修复 text 属性,当 safeModelData 为 null 时提供空字符串回退
3. 修复 icon.name、enabled 和 visible 属性,使用 safeModelData 替代直接
访问 modelData
4. 在电源插件中,将 D.ToolTip 替换为 ToolTip 附加属性以获得更好的集成
5. 为电源插件添加 QtQuick.Controls 导入以支持 ToolTip

Log: 修复了当 modelData 未定义时的组合框显示问题

Influence:
1. 测试个性化设置中的组合框,使用不同类型的模型
2. 验证当 modelData 未定义时组合框项目是否正确显示
3. 测试电源设置中组合框的工具提示功能
4. 验证图标显示、启用状态和可见性在使用 safeModelData 时正常工作
5. 测试组合框在数组和基于对象的模型下的行为
@robertkill
Copy link
Copy Markdown
Contributor Author

其它提交修复

@robertkill robertkill closed this Mar 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants