我正在努力配置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"
型
2条答案
按热度按时间1tuwyuhd1#
我已经删除了节点模块目录沿着与供应商运行 composer 再次安装。
我确保在composer.lock中只有两个新项目:
字符串
在此硬重置后,我可以看到来自
custom-autocomplete_controller.js
的控制台中的正确日志然后在
_onPreConnect
函数中,我可以修改TomSelect选项型
我仍然不知道我做的样式是否以正确的方式完成,但我刚刚为tomSelect添加了单独的样式表,我稍后将其导入主
style.scss
@import 'components/tomSelect';
个不管怎样-这工作OK。
aelbi1ox2#
根据文档,您应该删除
/* stimulusFetch: 'lazy' */
扩展控制器应该被急切地加载(remove /* stimulusFetch:'lazy' */),这样它就可以监听由原始控制器调度的事件。