Adaptive Card показывает блок ввода текста на основе установленного значения выбора

У меня есть карточка с набором опций выбора входа a, b, другие

введите описание изображения здесь

Если пользователи выбирают вариант как другие, то под набором выбора должен располагаться дополнительный текстовый блок ввода. Возможно ли это с помощью свойства Только показывать, когда элемент

введите описание изображения здесь

Вот моя адаптивная карта JSON

{
  "type": "AdaptiveCard",
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "version": "1.2",
  "body": [
    {
      "type": "Input.ChoiceSet",
      "choices": [
        {
          "title": "a",
          "value": "a"
        },
        {
          "title": "b",
          "value": "b"
        },
        {
          "title": "c",
          "value": "c"
        },
        {
          "title": "Others",
          "value": "Others"
        }
      ],
      "placeholder": "Select option"
    },
    {
      "type": "Input.Text",
      "placeholder": "Placeholder text",
      "isVisible": false
    },
    {
      "type": "ActionSet",
      "actions": [
        {
          "type": "Action.Submit",
          "title": "Submit"
        }
      ]
    }
  ]
}

и я использую html с библиотекой JavaScript webchat-es5 для рендеринга бота на страницу.


person User96    schedule 13.08.2020    source источник
comment
Я вижу, что вы использовали тег веб-чата, но в вашем вопросе нет упоминания о хосте / рендерере. Вы используете веб-чат в качестве клиента канала?   -  person Kyle Delaney    schedule 13.08.2020
comment
@Kyle Да, я использую веб-чат в качестве клиента канала.   -  person User96    schedule 14.08.2020
comment
К сожалению, сегодня это невозможно. Параметр «Показывать только когда» предназначен для определенных записей данных при использовании шаблонов. Вы могли бы сказать, только показывать, когда creator = 'xxx', но не можете ссылаться на другие элементы управления. Отображение / скрытие элементов на основе состояния управления сегодня невозможно, но это очень востребованная функция, которая может быть выпущена довольно скоро. Поскольку вы используете веб-чат, вы можете создать эту функцию самостоятельно.   -  person Tim Cadenbach    schedule 14.08.2020
comment
@ User96 - Я могу показать вам, как это сделать, на основе этого ответа, но мне нужна дополнительная информация от вас. Покажите нам свою адаптивную карту JSON и код веб-чата.   -  person Kyle Delaney    schedule 15.08.2020
comment
@Kyle - Я обновил этот вопрос с помощью своей адаптивной карты JSON.   -  person User96    schedule 18.08.2020
comment
@ User96 - Приемлем ли мой ответ?   -  person Kyle Delaney    schedule 19.08.2020


Ответы (1)


Всю информацию, необходимую для создания самообновляющейся адаптивной карты в веб-чате с использованием расширяемости адаптивной карты, можно найти в этом ответе: BotFramework-WebChat - Адаптивная карточка

В вашем случае есть несколько отличий, которые оправдывают написание другого ответа:

  1. Вы используете CDN вместо пакета NPM
  2. Вы используете пакет ES5, что, как я предполагаю, означает, что вы хотите, чтобы он работал в IE11.
  3. Вы пытаетесь переключить видимость вместо изменения текста

Как и в другом случае, нам нужно определить для себя схему именования, которую мы можем использовать для идентификации элементов карты, которыми должен управлять наш код. На этот раз я использую только одно ключевое слово: on.

{
  "type": "AdaptiveCard",
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "version": "1.2",
  "body": [
    {
      "type": "Input.ChoiceSet",
      "choices": [
        {
          "title": "a",
          "value": "a"
        },
        {
          "title": "b",
          "value": "b"
        },
        {
          "title": "c",
          "value": "c"
        },
        {
          "title": "Others",
          "value": "Others"
        }
      ],
      "placeholder": "Select option",
      "id": "main"
    },
    {
      "type": "Input.Text",
      "placeholder": "Placeholder text",
      "isVisible": false,
      "id": "on_main_Others"
    },
    {
      "type": "ActionSet",
      "actions": [
        {
          "type": "Action.Submit",
          "title": "Submit"
        }
      ]
    }
  ]
}

Считайте, что ввод набора вариантов является нашим переключателем, а текстовый ввод - нашей целью. Идентификатор входа набора выбора - это просто имя, которое мы выбрали для него (и все входы должны иметь идентификаторы, чтобы карта работала в любом случае, даже если мы не используем нашу собственную схему именования). Идентификатор текстового ввода принимает форму on_<input>_<value>, где <input> - это идентификатор нашего переключателя, а <value> - выбор, который делает цель видимой.

Вот код, который вы можете использовать для этой работы (обратите внимание, что он поддерживает IE11, не используя никаких стрелочных функций и т. Д.):

AdaptiveCards.AdaptiveCard.onParseElement = function (element) {
  const PREFIX_ON = 'on';
  const segments = element.id && element.id.split('_');

  if (segments && segments[0] == PREFIX_ON) {
    const card = element.getRootElement();
    const input = card.getElementById(segments[1]);
    const targetValue = segments[2];
    
    input.onValueChanged = function (sender) {
      // The isVisible setter automatically updates the rendered elements
      element.isVisible = (sender.value == targetValue);
    };
  }
};

Обратите внимание, что мы обращаемся к классам Adaptive Cards с помощью глобальной переменной AdaptiveCards. Возможно, вы догадались, что это становится доступным, когда вы используете Adaptive Cards CDN. Я должен предупредить вас, что, к сожалению, последняя версия CDN Adaptive Cards в настоящее время несовместима с последней версией веб-чата. В Adaptive Cards 2.x внесены критические изменения (которые можно ожидать в новой основной версии), а в веб-чате в настоящее время используется версия 1.2.6. Чтобы убедиться, что ваш код работает, вы должны указать версию CDN Adaptive Cards в своем HTML, и вы также можете указать версию веб-чата, если позже выйдут новые версии веб-чата, которые не работают с Adaptive Cards 1.2.6. .

<script crossorigin="anonymous" src="https://cdn.botframework.com/botframework-webchat/4.9.0/webchat-es5.js" ></script>
<script crossorigin="anonymous" src="https://unpkg.com/[email protected]/dist/adaptivecards.js" ></script>

Хотя неясно, нужно ли вам использовать свойство adaptiveCardsPackage в Node, я почти уверен, что вам нужно использовать его с CDN:

WebChat.renderWebChat(
  {
    adaptiveCardsPackage: AdaptiveCards,
    directLine: window.WebChat.createDirectLine({
      secretOrToken: secretOrToken
    })
  },
  document.getElementById('webchat')
);

Самообновляющаяся адаптивная карта

person Kyle Delaney    schedule 19.08.2020