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!
22.
Ajax-Powered HTML Updates & a CSS Transition
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
}
}
7 Comments
I have a question about the "connecting" aspect of Stimulus. When using Ajax to replace the form, Stimulus automatically connects to the new "controlled" divs that show up in the dom and create new instances of the controllers. But... does it also remove the old instances? If it doesn't this sounds like a possible memory leak.
Hey @JeffJones
Yes, Stimulus removes the instances that are no longer present in the DOM. It does this via "mutation observers" and calls
disconnect()on your Stimulus controller. That's the place where you can "undo" things like event listeners you don't need anymoreCheers!
Thanks for the explanation. I kinda assumed they were removed since this is a major library, but just wanted to check. Your explanation about the disconnect() method is very helpful. Again, thanks!
You're welcome!
Hey Ryan,
First of, loving it great series!
I noticed that the `cart-item` counter holds the number of items in the cart on top of the page. This however does not update since it is not within the extracted new twig template.
To achieve this, with my limited knowledge I see three options:
1) Make a second controller, that just fetches the number and replaces it. This would be two API calls when removing an item.
2) Return the entire page, but that seems a bit overkill.
3) Somehow extend the '_app_cart_list` to not only return the html, but also the new cart number. After we could dispatch in cart-list_controller an event to another controller to update the cart-item-number
What would be the recommended way to achieve this?
It would seem pretty simple to do a variation of the third option. Have '_app_cart_list' store the number in a data attribute on a div with a searchable id or class. And have the 'cart-item' counter displayed in a searchable span. After updating the html in the cart, find the count stored in the new data attribute and use it to replace the searchable span content.
Hi Peter!
This is one of the situations in which we wish that two Stimulus controllers could talk to each other. You can try to achieve this using the Stimulus Use package and send events from one controller so that another one can update. You would have to have one "main" controller (possibly spanning the entire page) to "catch" an event sent by the cart-list_controller and then send down an action onto the new controller in the header.
This however, in my personal experience, has been buggy or not 100% reliable. Another, in my opinion, easier way to achieve this is to just make the cart-list_controller into a more general "cart_controller" that spans the entirety of the DOM structure in the page. The set 2 targets, the one for the cart list and the one for the header. On changes to the cart, the one controller can choose to change the list (if present) or just the header.
I agree having one controller and 2 API calls for just updating the header might be a bit overkill, but it's not a bad solution either.
I hope this helped! Let me know if you have more questions!
"Houston: no signs of life"
Start the conversation!