Добавление вкладки редактора в SurveyJS - невозможно привязать к модели

Я экспериментирую с добавлением вкладки для конкретного приложения в SurveyJS, которая изначально не поддерживается. Что я сделал, так это добавление модели получателей, например:

import * as ko from "knockout";

export class RecipientsModel {
    public firstName: string = 'Chris';
    constructor() {}
    public show() {}
}

И шаблон (receients.html):

<script type="text/html" id="recipients">
  <div class="form-item form-type-textarea form-item-bulk-accounts">
    <label class="control-label" for="edit-bulk-accounts">Email addresses <span class="form-required" title="This field is required.">*</span></label>
    <div class="form-textarea-wrapper resizable textarea-processed resizable-textarea"><textarea class="form-control form-textarea required" id="edit-bulk-accounts" name="bulk_accounts" cols="60" rows="5"></textarea><div class="grippie"></div></div>
    <div class="description">Email addresses for participants you would like to register.  Enter one per line.</div>
  </div>
  <span data-bind="text: firstName">Test</span>
</script>

Я изменил editor.ts, чтобы моя вкладка показывалась, а содержимое заполнялось:

this.recipient = new RecipientsModel();
...
...
...
public showManageRecipients() {
    if (!this.canSwitchViewType(null)) return;
    this.recipient.firstName = 'Chris';
    // this.showSurveyRecipients();
    this.koViewType("recipients")
}

Итак, с тем, что я имею до сих пор, у меня есть вкладка, которая показывает статический контент, который я хочу. Следующим шагом является выяснение привязки, которая в данный момент нарушена:

knockout-min.js:72 Uncaught ReferenceError: Unable to process binding "template: function(){return { name:'recipients'} }"
Message: Unable to process binding "text: function(){return firstName }"
Message: firstName is not defined
at text (eval at parseBindingsString (knockout-min.js:68), <anonymous>:3:57)
at update (knockout-min.js:98)
at function.a.B.i (knockout-min.js:72)
at Function.Pc (knockout-min.js:51)
at Function.Qc (knockout-min.js:51)
at Function.aa (knockout-min.js:50)
at Object.a.m.a.B (knockout-min.js:49)
at knockout-min.js:72
at Object.q (knockout-min.js:11)
at m (knockout-min.js:71)

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

РЕДАКТИРОВАТЬ После дополнительной отладки я обновил свою модель, чтобы установить firstName к ko.observable: firstName = ko.observable("");, И в кодовой базе SurveyJs я установил его с помощью this.recipient.firstName('Chris');, Теперь я могу использовать: <span data-bind="text: recipient.firstName">Test</span> это нормально - но я думаю, что я должен каким-то образом связать модель таким образом, чтобы не требовалось использования recipient.firstName и я могу просто использовать firstName, Может я не прав.КОНЕЦ РЕДАКТИРОВАНИЯ

Итак, мой главный вопрос на данный момент: как мне заставить привязку this.recipient.firstName работать в моем шаблоне?

2 ответа

Решение

Вы можете изменить контекст привязки, используя with связывание:

<script type="text/html" id="recipients">
  <div class="form-item form-type-textarea form-item-bulk-accounts">
    <label class="control-label" for="edit-bulk-accounts">Email addresses <span class="form-required" title="This field is required.">*</span></label>
    <div class="form-textarea-wrapper resizable textarea-processed resizable-textarea"><textarea class="form-control form-textarea required" id="edit-bulk-accounts" name="bulk_accounts" cols="60" rows="5"></textarea><div class="grippie"></div></div>
    <div class="description">Email addresses for participants you would like to register.  Enter one per line.</div>
  </div>
  <!-- ko with: recipient -->
  <span data-bind="text: firstName">Test</span>
  <!-- /ko -->
</script>

Обновлено:

Начиная с 1.0.69 вы можете добавить пользовательскую вкладку в SurveyJS Editor (Builder) с помощью следующего кода:

  editor.tabs.push({
    name: "custom",
    title: "Custom Tab",
    template: "custom-template-id",
    data: {
      data: "Custom data"
    },
    action: () => {
      if (!editor.canSwitchViewType(null)) return;
      editor.koViewType("custom");
    }
  });

Вам также необходимо добавить соответствующий шаблон:

  <script type="text/html" id="custom-template-id">
    <div data-bind="text: data">
    </div>
  </script>
Другие вопросы по тегам