Chapters
46 Chapters
|
4:55:39
|
Login to bookmark this video
-
Course Code
Subscribe to download the code!
Subscribe to download the code!
-
This Video
Subscribe to download the video!
Subscribe to download the video!
-
Subtitles
Subscribe to download the subtitles!
Subscribe to download the subtitles!
-
Course Script
Subscribe to download the script!
Subscribe to download the script!
21.
Listening to An Event From Another Controller
Scroll down to the script below, click on any sentence (including terminal blocks) to jump to that spot in the video!
Subscribe to jump to this part in the video!
Keep on Learning!
If you liked what you've learned so far, dive in! Subscribe to get access to this tutorial plus video, code and script downloads.
This tutorial works perfectly with Stimulus 3!
What PHP libraries does this tutorial use?
// composer.json
{
"require": {
"php": ">=8.2",
"ext-ctype": "*",
"ext-iconv": "*",
"composer/package-versions-deprecated": "1.11.99.1", // 1.11.99.1
"doctrine/annotations": "^1.0", // 1.11.1
"doctrine/doctrine-bundle": "^2.2", // 2.2.3
"doctrine/doctrine-migrations-bundle": "^3.0", // 3.0.2
"doctrine/orm": "^2.8", // 2.8.1
"phpdocumentor/reflection-docblock": "^5.2", // 5.2.2
"sensio/framework-extra-bundle": "^5.6", // v5.6.1
"symfony/asset": "5.2.*", // v5.2.3
"symfony/console": "5.2.*", // v5.2.3
"symfony/dotenv": "5.2.*", // v5.2.3
"symfony/flex": "^1.3.1", // v1.21.6
"symfony/form": "5.2.*", // v5.2.3
"symfony/framework-bundle": "5.2.*", // v5.2.3
"symfony/property-access": "5.2.*", // v5.2.3
"symfony/property-info": "5.2.*", // v5.2.3
"symfony/proxy-manager-bridge": "5.2.*", // v5.2.3
"symfony/security-bundle": "5.2.*", // v5.2.3
"symfony/serializer": "5.2.*", // v5.2.3
"symfony/twig-bundle": "5.2.*", // v5.2.3
"symfony/ux-chartjs": "^1.1", // v1.2.0
"symfony/validator": "5.2.*", // v5.2.3
"symfony/webpack-encore-bundle": "^1.9", // v1.11.1
"symfony/yaml": "5.2.*", // v5.2.3
"twig/extra-bundle": "^2.12|^3.0", // v3.2.1
"twig/intl-extra": "^3.2", // v3.2.1
"twig/twig": "^2.12|^3.0" // v3.2.1
},
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "^3.4", // 3.4.0
"symfony/debug-bundle": "^5.2", // v5.2.3
"symfony/maker-bundle": "^1.27", // v1.30.0
"symfony/monolog-bundle": "^3.0", // v3.6.0
"symfony/stopwatch": "^5.2", // v5.2.3
"symfony/var-dumper": "^5.2", // v5.2.3
"symfony/web-profiler-bundle": "^5.2" // v5.2.3
}
}
What JavaScript libraries does this tutorial use?
// package.json
{
"devDependencies": {
"@babel/preset-react": "^7.0.0", // 7.12.13
"@popperjs/core": "^2.9.1", // 2.9.1
"@symfony/stimulus-bridge": "^2.0.0", // 2.1.0
"@symfony/ux-chartjs": "file:vendor/symfony/ux-chartjs/Resources/assets", // 1.1.0
"@symfony/webpack-encore": "^1.0.0", // 1.0.4
"bootstrap": "^5.0.0-beta2", // 5.0.0-beta2
"core-js": "^3.0.0", // 3.8.3
"jquery": "^3.6.0", // 3.6.0
"react": "^17.0.1", // 17.0.1
"react-dom": "^17.0.1", // 17.0.1
"regenerator-runtime": "^0.13.2", // 0.13.7
"stimulus": "^2.0.0", // 2.0.0
"stimulus-autocomplete": "^2.0.1-phylor-6095f2a9", // 2.0.1-phylor-6095f2a9
"stimulus-use": "^0.24.0-1", // 0.24.0-1
"sweetalert2": "^10.13.0", // 10.14.0
"webpack-bundle-analyzer": "^4.4.0", // 4.4.0
"webpack-notifier": "^1.6.0" // 1.13.0
}
}
9 Comments
Hello !
I'm facing the reverse situation of this. I'm designing a simple text editor and when the the user add a link I want to show a modal where he can type it.
So, when I'm clicking the
editor#toggleLinkbutton I want to do some checkings (like "is some text selected") and then open the modal. Then I enter the link and trigger theeditor#addLinkfunction, which check if it's a real link (if not render an error on the modal). add the link close the modal.But to open and close the modal, I cannot simply do
data-action="modal#open/close"beacause I first want to do some checkings before.The solution I have found is dispatching an event in my editor controller like
editor:openLinkModalandeditor:closeLinkModal. But the problem is that the event i bubbling up and not down in the child elements.If I try to catch it with
editor:closeLinkModal@window->modal#closeit will trigger all the modals if multiple editors are on the same page.I don't know if there is an elegant way to do this, or if my design is bad and I have to do it totally differently. If you could give some hints I would be very grateful.
Thanks again for the awesome courses !
Hey @Hugo-Le-Goff
As I see, your button is inside the modal controller, so you can bind several actions on this button like
data-action="editor#toggleLink modal#open"then you can do all check inside the editor action, and if checks are not passed, then you can stop executing actions and trigger something else, and if everything is ok, just leave stimulus to execute the next action.Cheers!
Thank you for your reply, it helped me a lot ! I achived it with
event.stopImmediatePropagation();in my toogleLink function.I also discovered outlets and
this.application.getControllerForElementAndIdentifier()which are handy if controller doesn't share the same parent.Hi Guys,
Thank you for your work.
I have a small question regarding the following subject:
And in
_logList.html.twigI do have an array.I tried to do:
But the last event is never triggered, I had to move my submit-form controller into each form.
Could you explain why this is happening ?
Hey @Amine
I don't fully understand your problem. Could you elaborate more?
Hi Symfonycast team,
Thank you very much for all your work !
As you mentioned, useDispatch() is now deprecated and we may directly use this.dispatch() directly in any native stimulus controller.
But how may we active debug mode to see the event in browser console ?
We use to add useDispatch(this,{debug:true}) in connect method.
How can it be done now ?
Cheers
Hey @ThierryGTH ,
Yeah, that does not work, but I think you can debug it in a bit different way using
console.log(), e.g. the event like this:you can debug like this:
I hope it will help!
Cheers!
Hi Ryan, nice work!!
Just a note. When I have nested stimulus controllers and the child one inside a turbo frame like this:
The method_name in controller_2 is executed only when the frame is loaded for the first time, but if the same content is reloaded in the frame through Turbo frame mechanism, the event is no longer propagated correctly when the button is clicked. For it to work I have to put the div that captures the event as the parent of the frame like this:
Or this way using @window:
Cheers.
Hey @Alcides!
Wow, that's super weird! It honestly smells like a bug - Stimulus is normally smart enough to not care if new content is loaded via Ajax later onto the page. So, I believe you - but this is very strange indeed. Good workaround though :).
Cheers!
"Houston: no signs of life"
Start the conversation!