You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让angular-schema-form数组下拉框包含自定义命令类型选项?

如何在angular-schema-form中动态添加自定义命令类型到数组下拉选项

背景

我正在使用angular-schema-form构建表单。

设置需求

我需要创建一个支持用户添加任意数量条目的数组表单,数组项里包含一个命令类型下拉框。这个下拉框需要默认包含SSH、REST选项,同时还要能把用户输入的自定义命令类型添加进去。

现有代码

SCHEMA

{
  "type": "object",
  "properties": {
    "personalizedCommandType": {
      "title": "Personalized Command Type",
      "type": "string"
    },
    "commands": {
      "type": "array",
      "title": "Actions",
      "items": {
        "type": "object",
        "properties": {
          "commandType": {
            "title": "Command Type",
            "type": "string",
            "enum": [ "REST", "SSH" ]
          }
        }
      }
    }
  }
}

FORM

[
  {
    "type": "help",
    "helpvalue": "<h5>Command</h5>"
  },
  {
    "key":"personalizedCommandType"
  },
  {
    "title":"Command",
    "key": "commands",
    "items": [ "commands[].commandType" ]
  }
]

当前问题

现在已经实现了自定义命令类型输入框,以及只包含SSH、REST选项的数组下拉框,但我希望用户输入自定义命令类型后,这个值能自动加入到下拉框的选项列表里。试过copyValueTo,但它只能修改model里的值,没法修改schema中的enum数组,满足不了需求。


别担心,这个问题可以通过监听输入变化动态更新schema,或者自定义控件来解决,我给你两种实用的思路:

方法一:监听输入变化,动态更新schema的enum数组

你可以在控制器里监听顶部自定义命令输入框的内容变化,一旦用户输入了有效内容,就把它添加到下拉框的选项列表里(注意要避免重复添加),然后触发表单重新渲染:

angular.module('yourApp').controller('FormController', function($scope) {
  // 初始化表单的schema、form和model
  $scope.schema = { /* 粘贴你的schema代码 */ };
  $scope.form = { /* 粘贴你的form代码 */ };
  $scope.model = {};

  // 监听自定义命令类型的输入变化
  $scope.$watch('model.personalizedCommandType', function(newVal, oldVal) {
    const trimmedVal = newVal?.trim();
    const enumArray = $scope.schema.properties.commands.items.properties.commandType.enum;
    if (trimmedVal && !enumArray.includes(trimmedVal)) {
      // 将新的命令类型加入选项列表
      enumArray.push(trimmedVal);
      // 通知表单重新渲染,更新下拉选项
      $scope.$broadcast('schemaFormRedraw');
    }
  });
});

方法二:自定义支持输入的下拉控件

如果想要更灵活的交互(比如允许用户直接在下拉框里输入新值),可以自定义一个angular-schema-form控件,把普通下拉框改成支持输入的组合控件,这样用户既能选已有选项,也能直接输入新值并同步到选项列表:

首先定义自定义控件:

angular.module('yourApp').config(function(schemaFormProvider) {
  schemaFormProvider.defineField('customCommandSelect', {
    template: `
      <div class="form-group" ng-class="{'has-error': form.$invalid}">
        <label class="control-label" ng-show="form.title">{{form.title}}</label>
        <input type="text" 
               class="form-control"
               list="commandOptions_{{$id}}"
               ng-model="model[form.key]"
               ng-change="addCustomCommand(model[form.key])">
        <datalist id="commandOptions_{{$id}}">
          <option ng-repeat="option in form.enum" value="{{option}}">{{option}}</option>
        </datalist>
      </div>
    `,
    controller: function($scope) {
      $scope.addCustomCommand = function(newVal) {
        const trimmedVal = newVal?.trim();
        if (trimmedVal && !$scope.form.enum.includes(trimmedVal)) {
          $scope.form.enum.push(trimmedVal);
        }
      };
    },
    scope: true
  });
});

然后修改你的FORM配置,替换成自定义控件:

[
  {
    "type": "help",
    "helpvalue": "<h5>Command</h5>"
  },
  {
    "key":"personalizedCommandType"
  },
  {
    "title":"Command",
    "key": "commands",
    "items": [
      {
        "key": "commands[].commandType",
        "type": "customCommandSelect",
        "enum": ["REST", "SSH"]
      }
    ]
  }
]

这样不管是通过顶部的输入框,还是直接在下拉框里输入新值,都能把自定义命令类型添加到选项列表中啦。

内容的提问来源于stack exchange,提问作者Rorschach

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:05:09