Как я могу объединить ember-bootstrap и ember-autoizeize?

Я хотел бы добавить атрибут autoresize=true к текстовой области, которая рисуется с помощью https://www.ember-bootstrap.com/ для использования ember-autoresize.

Как вы можете видеть здесь, этот атрибут не связан, поэтому я не могу просто добавить его в свой шаблон.

Я пытался манипулировать данным контролем так:

{{#bs-form formLayout="vertical" model=email as |form|}}
    {{#form.element controlType="textarea" property="textEdit" as |el|}}
        {{el.control autoresize=true}}
    {{/form.element}}
{{/bs-form}}

Но это работает только для classNames, но не для атрибутов.

Какой самый простой способ достижения того, что я пытаюсь сделать?

2 ответа

Есть два способа сделать это.

Оба примера предполагают ember-bootstrap а также ember-autoresize установлены.

1. Специальный подход: настройка не требуется, но менее удобна в использовании

Используйте "Пользовательские элементы управления", описанные здесь.

Вот пример:

{{#bs-form formLayout="vertical" model=email as |form|}}
    {{#form.element controlType="textarea" property="textEdit" as |el|}}
        {{textarea autoresize=true id=el.id value=el.value class="form-control"}}
    {{/form.element}}
{{/bs-form}}

Демонстрация: https://ember-twiddle.com/4860f5d660dceadc804495d2720f69f6?openFiles=templates.application.hbs%2C

2. Надежный подход: необходима конфигурация, но удобнее в использовании

Переопределить исходный компонент textarea.

Вот путь к классической структуре проекта. Для модулей или модулей, путь будет другим.

app/components/bs-form/element/control/textarea.js

Внутри этого файла сделайте то, что делает компонент textarea с автоматическим изменением размера, но поверх компонента textarea Ember-Bootstrap:

import BootstrapTextareaComponent from 'ember-bootstrap/components/bs-form/element/control/textarea';
import AutoResizeMixin from 'ember-autoresize/mixins/autoresize';
import { computed, get } from '@ember/object';
import { isEmpty, isNone } from '@ember/utils'; 

export default BootstrapTextareaComponent.extend(AutoResizeMixin, {
  autoresize: true,
  shouldResizeHeight: true,
  significantWhitespace: true,
  autoResizeText: computed('value', 'placeholder', {
    get() {
      var placeholder = get(this, 'placeholder');
      var value = get(this, 'value');
      var fillChar = '@';

      if (isEmpty(value)) {
        return isEmpty(placeholder) ? fillChar : placeholder + fillChar;
      }

      if (isNone(value)) {
        value = '';
      }

      return value + fillChar;
    }
  })
});

Затем вы можете вызвать компонент текстовой области Bootstrap в обычном режиме:

{{#bs-form model=this formLayout="vertical" as |form|}}
  {{form.element label="Inline" placeholder="Enter description..." property="appName" controlType="textarea"}}
{{/bs-form}}

Демонстрация: https://ember-twiddle.com/693209c5fd4c2eeae765827f42dbd635?openFiles=templates.application.hbs%2C

Приведенный выше код активирует автоматическое изменение размера всех текстовых полей Ember-Bootstrap. Если вам нужен гранулярный контроль, вы также можете удалить autoresize: true из определения компонента. Это позволит вам включить автоматическое изменение размера по отдельности, передав autoresize=true в {{form.element}} вызов компонента.

Похоже на использование ember-bootstrap а также ember-autoresize вместе не получится, потому что даже добавление ember-autoresize mixin не изменяет размер текстовой области автоматически, хотя mixin применяется успешно, о чем свидетельствует класс, добавленный ember-autoresize,

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

Кроме того, вы можете взломать решение вместе, манипулируя data-min-rows на входе, как этот пример кода jpenery.

Приведено для краткости:

// Applied globally on all textareas with the "autoExpand" class
$(document)
    .one('focus.autoExpand', 'textarea.autoExpand', function(){
        var savedValue = this.value;
        this.value = '';
        this.baseScrollHeight = this.scrollHeight;
        this.value = savedValue;
    })
    .on('input.autoExpand', 'textarea.autoExpand', function(){
        var minRows = this.getAttribute('data-min-rows')|0, rows;
        this.rows = minRows;
        rows = Math.ceil((this.scrollHeight - this.baseScrollHeight) / 16);
        this.rows = minRows + rows;
    });

Bootstrap добавляет jQuery в любом случае. С таким же успехом

Другие вопросы по тегам