webpack Symfony UX - TomSelect Autocomplete自定义js控制器问题

rfbsl7qr  于 5个月前  发布在  Webpack
关注(0)|答案(2)|浏览(73)

我正在努力配置Symfony UX Autocomplete组件扩展-我的目标是修改TomSelelct示例-其呈现方式并添加https://tom-select.js.org/plugins/checkbox-options/等选项
我有一个自动完成的工作示例,定义如下:
第一个月

#[AsEntityAutocompleteField]
class EntityAutocompleteField extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver): void
    {
        $resolver->setDefaults([
            'class' => Entity::class,
            'searchable_fields' => ['name'],
            'label' => 'entity',
            'choice_label' => 'name',
            'attr' => [
                'data-controller' => 'custom-autocomplete', //this should point me to custom controller - right?
            ],
            'multiple' => true,
        ]);
    }

    public function getParent(): string
    {
        // In 2.13 it will be replaced by BaseEntityAutocompleteType
        return ParentEntityAutocompleteType::class;
    }
}

字符串
单位:./assets/controllers.json

{
    "controllers": {
        "@symfony/ux-autocomplete": {
            "autocomplete": {
                "enabled": true,
                "fetch": "eager",
                "autoimport": {
                    "tom-select/dist/css/tom-select.default.css": true,
                    "tom-select/dist/css/tom-select.bootstrap5.css": false
                }
            }
        }
    },
    "entrypoints": []
}


./assets/controllers/custom-autocomplete_controller.js中:

import { Controller } from '@hotwired/stimulus';

/* stimulusFetch: 'lazy'*/ //I am not sure if this shoul dbe lazy - it does not work without this line anyway 
export default class extends Controller {

  initialize() {
//THIS IS NOT WORKING
    console.debug("Init");
    this._onPreConnect = this._onPreConnect.bind(this);
    this._onConnect = this._onConnect.bind(this);
  }

  connect() {
    console.debug("Connect");

    this.element.addEventListener('autocomplete:pre-connect', this._onPreConnect);
    this.element.addEventListener('autocomplete:connect', this._onConnect);
  }

  disconnect() {
    console.debug("Disconnect");

    // You should always remove listeners when the controller is disconnected to avoid side-effects
    this.element.removeEventListener('autocomplete:connect', this._onConnect);
    this.element.removeEventListener('autocomplete:pre-connect', this._onPreConnect);
  }

  _onPreConnect(event) {
    // TomSelect has not been initialized - options can be changed
    console.log(event.detail.options); // Options that will be used to initialize TomSelect
    event.detail.options.onChange = (value) => {
      // ...
    };
  }

  _onConnect(event) {
    console.log(event.detail.tomSelect); // TomSelect instance
    console.log(event.detail.options); // Options used to initialize TomSelect
  }
}


在我的./webpack.config.js中,我只启用了刺激桥,并添加了main app.js:

Encore
 ...
    .addEntry('app', './assets/js/app.js')
    .enableStimulusBridge('./assets/controllers.json')


在我的./assets/js/app.js

import { startStimulusApp } from '@symfony/stimulus-bridge';

export const app = startStimulusApp(require.context(
  '@symfony/stimulus-bridge/lazy-controller-loader!./../controllers/',
  true,
  /\.[jt]sx?$/
));


自动完成的逻辑工作正常,但我找不到修改TomSelect示例的方法-似乎没有加载/找到自定义自动完成控制器,因为控制台中没有日志。
我可以看到./public/build目录中的控制器后,我做了

bin/console assets:install
yarn install
yarn build
bin/console cache:clear
yarn watch


在我的composer json中有新的行;

"@hotwired/stimulus": "^3.0.0",
    "@symfony/stimulus-bridge": "^3.2.0",
    "@symfony/stimulus-bundle": "file:vendor/symfony/stimulus-bundle/assets",
    "@symfony/ux-autocomplete": "file:vendor/symfony/ux-autocomplete/assets",
    "tom-select": "^2.2.2",


In yarn.lock:

"@symfony/stimulus-bridge@^3.2.0":
  version "3.2.2"
  resolved "https://registry.yarnpkg.com/@symfony/stimulus-bridge/-/stimulus-bridge-3.2.2.tgz#afc1918f82d78cb2b6e299285c54094aa7f53696"
  integrity sha512-kIaUEGPXW7g14zsHkIvQWw8cmfCdXSqsEQx18fuHPBb+R0h8nYPyY+e9uVtTuHlE2wHwAjrJoc6YBBK4a7CpKA==
  dependencies:
    "@hotwired/stimulus-webpack-helpers" "^1.0.1"
    "@types/webpack-env" "^1.16.4"
    acorn "^8.0.5"
    loader-utils "^2.0.0"
    schema-utils "^3.0.0"

"@symfony/stimulus-bundle@file:vendor/symfony/stimulus-bundle/assets":
  version "1.0.0"

"@symfony/ux-autocomplete@file:vendor/symfony/ux-autocomplete/assets":
  version "1.0.0"

"@hotwired/stimulus-webpack-helpers@^1.0.1":
  version "1.0.1"
  resolved "https://registry.yarnpkg.com/@hotwired/stimulus-webpack-helpers/-/stimulus-webpack-helpers-1.0.1.tgz#4cd74487adeca576c9865ac2b9fe5cb20cef16dd"
  integrity sha512-wa/zupVG0eWxRYJjC1IiPBdt3Lruv0RqGN+/DTMmUWUyMAEB27KXmVY6a8YpUVTM7QwVuaLNGW4EqDgrS2upXQ==

"@hotwired/stimulus@^3.0.0":
  version "3.2.2"
  resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.2.2.tgz#071aab59c600fed95b97939e605ff261a4251608"
  integrity sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A==

tom-select@^2.2.2:
  version "2.3.1"
  resolved "https://registry.yarnpkg.com/tom-select/-/tom-select-2.3.1.tgz#df338d9082874cd0bceb3bee87ed0184447c47f1"
  integrity sha512-QS4vnOcB6StNGqX4sGboGXL2fkhBF2gIBB+8Hwv30FZXYPn0CyYO8kkdATRvwfCTThxiR4WcXwKJZ3cOmtI9eg==
  dependencies:
    "@orchidjs/sifter" "^1.0.3"
    "@orchidjs/unicode-variants" "^1.0.4"

1tuwyuhd

1tuwyuhd1#

我已经删除了节点模块目录沿着与供应商运行 composer 再次安装。
我确保在composer.lock中只有两个新项目:

"name": "symfony/ux-autocomplete",
...
"name": "symfony/stimulus-bundle",

字符串
在此硬重置后,我可以看到来自custom-autocomplete_controller.js的控制台中的正确日志
然后在_onPreConnect函数中,我可以修改TomSelect选项

_onPreConnect(event) {
    // TomSelect has not been initialized - options can be changed
    let options = event.detail.options;

    options.render = {
      option: function(data, escape) {
        return '<div>' + escape(data.text) + '</div>';
      },
    };

    options.plugins.checkbox_options = {};
    options.plugins.clear_button = {};
    delete options.plugins.remove_button;
}


我仍然不知道我做的样式是否以正确的方式完成,但我刚刚为tomSelect添加了单独的样式表,我稍后将其导入主style.scss
@import 'components/tomSelect';
不管怎样-这工作OK。

aelbi1ox

aelbi1ox2#

根据文档,您应该删除/* stimulusFetch: 'lazy' */
扩展控制器应该被急切地加载(remove /* stimulusFetch:'lazy' */),这样它就可以监听由原始控制器调度的事件。

相关问题