Rainer Hahnekamp

Rainer Hahnekamp

Welcome to my KZread channel!

I'm Rainer, a full-stack developer from Austria specializing in Angular and Spring.

As a Google Developer Expert and a trainer/consultant at AngularArchitects.io, I'm here to share my expertise with you.

Subscribe and stay updated with my latest content! Don't forget to connect with me on X (@rainerhahnekamp).

Reactive Contexts

Reactive Contexts

Introducing Playwright

Introducing Playwright

GraalVM and Spring

GraalVM and Spring

Angular 14.1

Angular 14.1

NgRx createFeature

NgRx createFeature

Пікірлер

  • @kirilhalahan4313
    @kirilhalahan4313Сағат бұрын

    Thanks Rainer for the helpful video! I have a couple of questions about Signal Store: 1. Is it possible to reference values from another store in computed properties, or does the concept of Signal Store oppose this? 2. Does any existing Redux plugin work with Signal Store, or are there alternatives available? Thank you!

  • @RainerHahnekamp
    @RainerHahnekampСағат бұрын

    Hi Kiril, thanks as well. 1. Yes, you can reference Signals from other Signal Stores in your computeds. In the end they are all native Signales 2. Have you tried out github.com/angular-architects/ngrx-toolkit for Redux? If yes, and it doesn't work let me know. Cheers!

  • @kirilhalahan4313
    @kirilhalahan431348 минут бұрын

    @@RainerHahnekamp Thank you for the quick response, I will try it immediately

  • @rafajuchnicki1713
    @rafajuchnicki17132 сағат бұрын

    How to deal with deep properties updates? Something like toggling email state which is nested in my state objects: changeEmailNotificationEnabled(emailEnabled: boolean) { patchState(state, { organizationInformation: { ...state.organizationInformation(), emailNotification: { ...state.organizationInformation.emailNotification(), enabled: emailEnabled } } }); }, do i have to copy every level of nesting or is there a better approach?

  • @RainerHahnekamp
    @RainerHahnekamp2 сағат бұрын

    Unfortunately yes. If you go with github.com/timdeschryver/ngrx-immer you can also do a mutable update, though.

  • @jacqueskloster4085
    @jacqueskloster40855 сағат бұрын

    I just implemented a signal store for a part of the app where I had a full blown ngrx store before with actions, effects etc. I have to say it's very appealing especially in apps where you cannot shake the feeling that the full ngrx store is just... overkill. And boy it is overkill given the amount of boilerplate code and decentralization of coherent things happening. I also like the approach more than how component stores were setup. This is a lot more beginner friendly, uses modern angular features and just works. And you have (almost) everything in one place. For "get that api response in and let's work on the data" things that aren't overly complex by themselves, I happily dropped the full store despite its advantages regarding tracking, devtools, ... Full ngrx stores are really only necessary in apps where you have a gazillion of components and a very modular environment with many things that need to react to a change of data somewhere.

  • @AenGex
    @AenGex14 сағат бұрын

    Thank you for the video Rainer, really informative! I have a question/inner reflection; Assume you have a questions page, with a method 'loadAll' that you wanna have provided in route. What is your approach on this? CanActivate guard and return true? Resolver and return true? It seems slightly awkward to me and I am juggling between best approach.

  • @RainerHahnekamp
    @RainerHahnekamp13 сағат бұрын

    I don't use resolvers when I have state management. What I do instead, to go with guards. The guard triggers the loading and might wait until the store returns the OK that it has loaded the data. Not sure, if this was what you were asking for. If not, please clearify.

  • @AenGex
    @AenGex11 сағат бұрын

    @@RainerHahnekamp Thank you, much appreciated the response! One last thing that I would like to hear your opinion on it. Let's say in one page you call `loadAll`, would you also call in CanDeactivate context a store method 'resetAll' that resets questions to initial state?

  • @RainerHahnekamp
    @RainerHahnekamp3 сағат бұрын

    @AenGex Probably not; if you say loading and destroying is bound to the route, then that sounds to me like a state for local state management. Do you have a component which is bound to that particular route? If yes, then the component should provide the Store. The store has an onInit hook where it loads the data. When the user leaves the component, the Store gets automatically destroyed. If your use case is more complicated than I think, then there might a reason for the guards.

  • @AenGex
    @AenGexСағат бұрын

    @@RainerHahnekamp Thank you, I understand your point. I don't have a use case in particular, but rather thoughts for common patterns with NgRx. You covered it completely! Thank you for the input and your awesome work!

  • @borjaalvarez3483
    @borjaalvarez348314 сағат бұрын

    Awesome!!! 👏👏

  • @RainerHahnekamp
    @RainerHahnekamp14 сағат бұрын

    Thanks Borja!

  • @koempf
    @koempf16 сағат бұрын

    das quiz folder finde ich nicht in Deinem github repository... die patchState Function hat sonst keine Neuerung? Heisst Weiterhin bei immutability immerPatchState verwenden ? Ansonsten wie immer super Rainer :-) echt super!

  • @RainerHahnekamp
    @RainerHahnekamp16 сағат бұрын

    Hi Steffen, danke, danke Mach mich nicht schwach wegen dem fehlenden Repo! Ist eh alles da: github.com/rainerhahnekamp/ngrx-signal-store-release/blob/main/src/app/holidays/feature/quiz/quiz-store.ts Ja, keine Neuerungen beim patchState. Es wurde eher auf "enterprisy"-Features gesetzt und ein bisschen die Erweiterbarkeit verbessert.

  • @koempf
    @koempf16 сағат бұрын

    @@RainerHahnekamp stimmt sorry ich hab falsch geschaut :-) Steffen mal wieder ;-)

  • @staoish
    @staoish17 сағат бұрын

    What exactly are the benefits of using the ngrx signalstore vs writing a custom angular service containing some signals and maybe rxjs functions. For me custom services are way easier to write / read / extend / understand and you are relying on another library

  • @RainerHahnekamp
    @RainerHahnekamp16 сағат бұрын

    You will probably write something very similar to the patchState and slices - something that generates slices on the fly and makes it easy to update a Signal. You also want to make sure that your self-written services follow a common style so that developers can easily switch between different code parts. Then, you will also need to reuse certain existing features you have written in one service in another. Yes, you can do it all yourself, but at a certain point in time, I say I just take what is already available, battle-tested, and well-known (like NgRx) in the Angular community. I'd like to add that it is also easy to learn and doesn't come with boilerplate code. It is the typical buy-or-make decision. When it comes to state management, I would always choose "buy."

  • @staoish
    @staoish6 сағат бұрын

    ​@@RainerHahnekampIn my opinion there is actually a lot of boilerplate. Creating your signal stores with all the with* functions is pretty much boilerplate and adds a lot of complexity and you still have to implement all methods and rxjs logic yourself. I would argue that you gain very little but add a lot of unnecessary complexity and unnecessary "vendor lock in". Another point i see is that especially "junior" guys might not understand whats "under the hood" and wont learn the basics properly

  • @RainerHahnekamp
    @RainerHahnekamp3 сағат бұрын

    @@staoish An answer to a comment on KZread: WIthout the with* function, you are loosing the structure. Then you have a simple Angular service where your developers putting the computeds, logic, DI in different places. The SignalStore enforces that these elements have a specific location. It makes the code more readable - and yes it does that by adding boilerplate. You might be able to do same via ESLint, but somebody has to write that rule as well. An application is not a playground to learn coding. I don't want to have five different, self-written state management services in the codebase. You see where I am heading to? Junior developers should learn the intricacies of Signals but please not in an application that's shipped to end users. An extreme example: You will not let a "Junior pilot" fly a plane with hundreds of passengers. That's why they have simulators. Does that make sense?

  • @staoish
    @staoish8 минут бұрын

    @@RainerHahnekamp Yeah we agree to disagree here i think. I would rather teach a junior how to properly write a clean "store service" and explain the necessary concepts and enforce them via pull requests. Especially because i feel the creation of a ngrx signalstore is really complicated compared to a service and in my opinion it does not increase readability but even reduces it Another important point: a newly hired angular developer will get the self written store service concept immeditately and does not have to learn another library. I feel the disadvantages overweigh the benefits by far

  • @davesharman8302
    @davesharman830218 сағат бұрын

    Thanks Ranier, this was a helpful video on the new features.

  • @RainerHahnekamp
    @RainerHahnekamp18 сағат бұрын

    Thanks, you are very welcome Dave.

  • @JeffryGonzalezHt
    @JeffryGonzalezHt18 сағат бұрын

    Worth the wait! Fantastic work - to you and the whole team. The signalStoreFeature was the missing piece for me, and I didn't even know it. ;)

  • @rolandjost3823
    @rolandjost382320 сағат бұрын

    The best trainer. Thanks for sharing

  • @RainerHahnekamp
    @RainerHahnekamp20 сағат бұрын

    Thanks for your ongoing support Roland.

  • @ARIAS9306
    @ARIAS930623 сағат бұрын

    First of all, thank you very much for your content, it is very good. Now I have a question, is it recommended/good practice to access the Store from the template?

  • @RainerHahnekamp
    @RainerHahnekamp23 сағат бұрын

    Thanks. If it is like in my example that the service provides already the data and the event listeners "bite-sized for the template", I'd say yes. The more generic the service becomes, the more I'd tend ont to use it directly in the template. So summarized, for local state management, probably yes, for global... very likely not.

  • @ARIAS9306
    @ARIAS930622 сағат бұрын

    @@RainerHahnekamp thanks for your answer 👍

  • @andyhb1970
    @andyhb197016 сағат бұрын

    Hi Ranier great video as always, a quick question, in your signal store you use the variable name store for with methods but state for withComputed. Is that personal preference? I frequently find myself debating this with myself is it a store or is it the state 🤔

  • @RainerHahnekamp
    @RainerHahnekamp16 сағат бұрын

    @@andyhb1970 There is a difference. withComputed only gets the state and not access to the methods you might have defined before, whereas withMethods has access to everything. Just clone my example and you will set that withMethods has all the methods of withCountdown and withComputed doesn't.

  • @DJpiya1
    @DJpiya13 күн бұрын

    Another fantastic content. Awesome. Looking forward to see Spring OAuth + OpenID + Spring Session integration with SPA frontend. Thanks a lot.

  • @RainerHahnekamp
    @RainerHahnekamp3 күн бұрын

    Yup, that was the idea. The article has already been published several months go. The video is missing.

  • @DJpiya1
    @DJpiya13 күн бұрын

    @RainerHahnekamp lovely, ur contents are fantastic. Please keep them coming in. 🙏🙏

  • @DJpiya1
    @DJpiya14 күн бұрын

    Man, u r awesome 🎉😎, its surprising that this video has more than 1k views and only 47 likes. Anyway, u got a new subscriber. Thanks for this wonderful content.

  • @RainerHahnekamp
    @RainerHahnekamp4 күн бұрын

    Thanks a lot. I really should do more Spring-related videos...

  • @wiliamferraciolli5380
    @wiliamferraciolli53804 күн бұрын

    This is great, got a bit tricky at the end, but thanks a lot

  • @RainerHahnekamp
    @RainerHahnekamp4 күн бұрын

    Yeah, I know. Extensibility is the most powerful feature but also the hardest.

  • @prasoon2510
    @prasoon251012 күн бұрын

    If i need to do some operations based on signal data, how to do that in component.. Not able to do that

  • @RainerHahnekamp
    @RainerHahnekamp12 күн бұрын

    Hi Prasoon, generally speaking, that's what an effect is for. Can you maybe give me a concrete example?

  • @prasoon2510
    @prasoon251011 күн бұрын

    @@RainerHahnekamp Yes I used effect and it works.. Can we use multiple effect of same component or not??

  • @RainerHahnekamp
    @RainerHahnekamp11 күн бұрын

    @@prasoon2510 Yes, you can have as many effects as you want.

  • @prasoon2510
    @prasoon251011 күн бұрын

    @@RainerHahnekamp Thank you so much for the quick response 😊❤️

  • @RainerHahnekamp
    @RainerHahnekamp11 күн бұрын

    @@prasoon2510 You are very welcome. If something is still unclear, let me know

  • @SaleemKhan17
    @SaleemKhan1712 күн бұрын

    Can you share your vscode extensions?

  • @RainerHahnekamp
    @RainerHahnekamp12 күн бұрын

    Saleem, that's IntelliJ what I'm using. If you mean the inlay Hints, they are available in VSCode as well: code.visualstudio.com/docs/typescript/typescript-editing#_inlay-hints

  • @n8_may
    @n8_may13 күн бұрын

    @20:16 I believe exhaustMap() should be used over switchMap(). switchMap() would restart the stream rather than ignoring subsequent ones

  • @RainerHahnekamp
    @RainerHahnekamp13 күн бұрын

    If I use an exhaustMap and switch quickly between page 2, 3 and 4, it could happen that requests for 3 and 4 are not processed. exhaustMap waits for the inner observable to complete and ignores all incoming values from the outer observable. So for pagination, you usually go with switchMap.

  • @emilsirbu236
    @emilsirbu23614 күн бұрын

    As always super valuable content, thanks Rainer! 💪

  • @RainerHahnekamp
    @RainerHahnekamp14 күн бұрын

    Thanks Emil

  • @lahcenaouina
    @lahcenaouina15 күн бұрын

    Can please do a video explain how to manage cach (CRUD with Pagination) using ngRX

  • @RainerHahnekamp
    @RainerHahnekamp12 күн бұрын

    Hey, I'm not sure if CRUD + Pagination is enough for a complete video but I can answer specific questions, if you have any. What are you struggling with? In the end you have a list of entities with the CRUD actions and additional actions to swtch pages.

  • @meerawisniewski1351
    @meerawisniewski135116 күн бұрын

    Great example. What if my load method takes 2 more parameters they are signals? Do i need separate state for that? would my load method will call when those values changes? Currently i am using angular effects with signals and effects for loading data gets called when any of those values changes.

  • @RainerHahnekamp
    @RainerHahnekamp15 күн бұрын

    Thanks. If the parameteruses is a Signal, rxMethod applies an effect to it. If it is an Observable, it subscribes to it. Every time an Observable emits or Signal emits (careful with glitch-free), the inner Observable is executed. To put it short for Signals: rxMethod is just a wrapper around the effect function with an untracked in it. Did I answer your questions?

  • @aymensellaouti5007
    @aymensellaouti500719 күн бұрын

    Great Job. Thank you for all the videos and articles you share with the community, it helps a lot.

  • @RainerHahnekamp
    @RainerHahnekamp19 күн бұрын

    Thanks, I hope I can publish new videos very soon.

  • @uchto4
    @uchto419 күн бұрын

    I'm always thinking about the glitch-free-effect. What if I call a method for example twice with different inputs? Will the first one be gone? What if I want to use the signalstore for events . I fill a buffer with events from a websocket. Will I lose data? I really like the signal store, but I can't get my head around this. :o

  • @RainerHahnekamp
    @RainerHahnekamp15 күн бұрын

    So if you call a method twice synchronously, the first one will be dropped. WebSocket messages usually arrive asynchronously, so they won't be dropped by the glitch-free effect. You can use the SignalStore for events with rxMethod, but you have to think what type you use to represent that event. I would avoid putting an event into as Signal, usually the events comes from an Observable or an event listener (also works without rxMethod). Observables and event listeners are both fine. If you end up having dependencies between signal stores, then you will very quickly have an event in the form of a Signal. You might now be worried about the glitch-free effect, but from my experience, it is very rarely a real issue.

  • @dezee2412
    @dezee241223 күн бұрын

    A very informative and well-presented video, thanks Rainer I learnt a lot .

  • @RainerHahnekamp
    @RainerHahnekamp23 күн бұрын

    @@dezee2412 thanks a lot as well

  • @zajunc69
    @zajunc6924 күн бұрын

    22:25 - why this child component is not updating itself? It has ChangeDetectionStrategy.Default and setInterval inside of it. My understanding is that it's because setInterval is a global action on Window and ChangeDetectionStrategy.OnPush in ListComponent is blocking tick() to propagate down to TimerComponent, am I right?

  • @RainerHahnekamp
    @RainerHahnekamp23 күн бұрын

    YES, I don't have anything to add to your statement. 💯 correct

  • @ml_serenity
    @ml_serenityАй бұрын

    Regarding 46:00 I think it's much simpler: the effect() takes an arrow function. If no signals inside that function emitted changed value since last change detection cycle, then the whole arrow function is not executed, but if any one or more have their values changed, then the whole arrow function is executed. Also, I believe it uses reference equality to tell if signal should produce a new value to consumers. That's why immutability of the internal state is so important.

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Hi, what do you mean exactly? The dynamic tracking is an advanced feature and I guess not used in the majority of use cases.

  • @ml_serenity
    @ml_serenityАй бұрын

    @@RainerHahnekamp I mean the logic to run or not run the effect lambda is probably determined by whether any one or more of the tracked signals associated with it have a new value or not.

  • @RainerHahnekamp
    @RainerHahnekamp27 күн бұрын

    @@ml_serenity Yes, but dynamic dependency tracking does exist: github.com/angular/angular/tree/main/packages/core/primitives/signals#dynamic-dependency-tracking

  • @mohsenarshad1588
    @mohsenarshad1588Ай бұрын

    This video is beyond awesome, thanks a lot for giving so many details and clear explanation.

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Thanks a lot! Happy to hear

  • @DerAlexD
    @DerAlexDАй бұрын

    yet one question remains how do i test signalStores

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    I guess, you've already found my other video on how test Signals, right ;)

  • @DerAlexD
    @DerAlexDАй бұрын

    @@RainerHahnekamp Yep thanks :)

  • @DerAlexD
    @DerAlexDАй бұрын

    very good video, so same method applies to my signalStore, or do i have to do something different ?

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Yes, the SignalStore is an Angular Service which exposes native Signals. All things apply there as well.

  • @rishukumar7586
    @rishukumar7586Ай бұрын

    why jasmine karma still exists in v18?

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Karma does still exist, because they are still working on the migration to Web Test Runner. To be fair, one has to say that Jasmine/Karma doesn't have any issues - it is running fine - so they don't see this task as main priority. Jest will come after Web Test Runner is done and Jasmine will stay (as I said in the video). Btw, in th meantime, I would use Jasmine for a new project. Given the troubles we have with Jest/Angular and the pace of the migrations, I am afraid official Jest support is something we get in 2025. Last year, I had the impression that Jest will already be available in Angular 17.

  • @rkrao8582
    @rkrao8582Ай бұрын

    Do you have written this guide somewhere? Like in medium or some other place? Because audio on this is not so great and putting me off.

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Hey, unfortunately no. What is the issue with the audio? I mean I know I am not a native speaker but microphone should be quite good.

  • @pazzuto
    @pazzutoАй бұрын

    This is great content as always. The concern I have about moving to standalone components is the bundle size. I haven't taken a deep look into this, but I've read here and there that there's a lot of code duplicated and your app actually grows in size. I'm sure it can be mitigated with lazy loading, but it's something to consider.

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Hi, where did you hear about the bundle size issue? Could it be that you are mistake standalone with the barrel files? Having a lot of barrel files (index.ts) will problems to your bundler because it might not be able to tree-shake them efficientyl, and you may end up with a huge initial bundle. Regarding Standalone vs NgModule, there is no impact on the bundle size.

  • @arnoldm5358
    @arnoldm5358Ай бұрын

    Hi, great video again! I'm using createActionGroup method to organize actions from the source which uses them. This way, different actions can lead to the same effect like calling the loadCustomer method from a service for example. This is where I'm struggling with the facade pattern... How can I implement the customerFacade? Do I have to implement several methods like fromPageXLoadCustom(), fromPageYLoadCustomer()... in order to dispatch the right action? I mean that I don't want to loose the origin of each action for debugging purposes.

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    I see, you are the action hygiene. So you have one facade method per action. If you have multiple actions, then you also have multiple methods. As a side note: If you have multiple actions just for debugging purposes, why don't you add {context: string} property to the action's payload. Saves the the same purpose. On the other side, if you have different load actions, stick to what you have.

  • @arnoldm5358
    @arnoldm5358Ай бұрын

    @@RainerHahnekamp Thank you for your reply! So It seems that using createActionGroup method and a facade service is not really appropriate. The source property in createActionGroup method is the interesting property (as well as the organisation of the actions of course) and unfortunately we can't benefit to use it.

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    @@arnoldm5358 To be sure there is no misunderstanding. With "stick to what you have", I meant a facade with one method per action.

  • @toromanow
    @toromanowАй бұрын

    I'm experiencing the following issues: 1) When I uncomment the webserver section in playwright.config.ts, then playwright reports "No tests" 2) In my test *.spec.ts file, await page.goto('') results in an error with no explanation. Thoughts?

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    You typically get that message, if you have an invalid configuration file. Check that your commenting also wasn't applied to some things (parenthesis for example). If you uncomment it, and Playwright works, it is definitely an invalid config. You can post the contents of it here as well.

  • @toromanow
    @toromanowАй бұрын

    @@RainerHahnekamp Actually, found those issues to be specific to Windows. All works fine on Ubuntu.

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    @@toromanow It shouldn't make a difference...

  • @youpeekayey
    @youpeekayeyАй бұрын

    Sweet mama, fantastic stuff. Most in-depth guide in this topic that i found on yt. Thanks for this and keep up with great work! And subscribed ;)

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Thanks Doman, will do. The next "big one" will be about RxJs and a little bit longer.

  • @youpeekayey
    @youpeekayeyАй бұрын

    @@RainerHahnekamp ​ Great, RxJS is also very interesting topic so I will surely watch it. Btw. RxJs is broad topic so I'm not expecting that you will touch this subject in mentioned video but for future content you could consider adding to your 'pool of ideas' reactive/declarative vs imperative style of programming in context of RxJs (it's not so obvious for many programmers who are used to write imperative code - me included)

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    @@youpeekayeyI touched a little bit on it. I think that RxJs forces you to do declarative programming and I have seen very often that people overuse that paradigm. So I have an example where I show how simple it can become if you add a little bit of side effects into it. We will see 😅

  • @rolandjost3823
    @rolandjost3823Ай бұрын

    Thank you Rainer

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    As always, you are very welcome Roland!

  • @marcwinner567
    @marcwinner567Ай бұрын

    Thanks for the vid! Learned something new 🎉

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Great, I stumbled upon the different behavior in a workshop and thought it might be useful to share.

  • @dhavalv
    @dhavalvАй бұрын

    Thank you Rainer for this video. I always make sure to listen to all of your videos, always learn something not documented

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Thanks Dhaval, and also for your ongoing support. You are a well-known face to me 👍

  • @etexalbania7301
    @etexalbania7301Ай бұрын

    thank you for the video, a question about testing, why haven't you done a video for angular testing with Selenium?

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    I don't see any benefit in using Selenium anymore. I've been using Selenium (Selenide) for so many years, and we had to deal with so many flaky tests that we gave up one time. When Cypress came out, we gave E2E testing with Cypress another chance and were more than happy. Since then, I've never heard that somebody really enjoyed working with any webdriver-based derivate. Since I would not use it, I don't want to make a video about it. I know that there is now WebDriver Bidi. It has been hailed to bring the same quality as CDP (Cypress, Playwright) but download statistics show a completely different picture. Did I miss anything, respectively is there a particular reason why you are asking?

  • @etexalbania7301
    @etexalbania7301Ай бұрын

    @@RainerHahnekamp thank you. I asked because a lot of testers QA teams use Selenium from what I see in jobs posts and I wonder why it was not used with Angular in any of your videos, and you are the best person to ask for it when talking about testing 🙂 .Have a great day

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    @@etexalbania7301 Yes, you also have remember that Selenium was the standard framework for more than a decade. In huge environments you don't change that quickly. So I don't think that there will be demand for Selenium developers in the future as well. For new projects, though, Selenium doesn't seem to be the first choice anymore (diplomatically said).

  • @JOELJOSEPHCHALAKUDY
    @JOELJOSEPHCHALAKUDYАй бұрын

    thanks, that was a wonderfull overview

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    You're welcome, happy to hear!

  • @koempf
    @koempfАй бұрын

    great Video :-) thanks Rainer ! top

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Most appreciated Steffen!

  • @nayrban2187
    @nayrban2187Ай бұрын

    I was talking with a teammate the other day about how most content explains the easy and "obvious" scenarios, but you also cover real scenarios, so thank you

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Yes, one has to try it on a more realistic application in order to know if it can keep what it promises.

  • @aianam5354
    @aianam5354Ай бұрын

    Thank you Rainer ❤ very helpful

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Thanks Aiana and you are very welcome 🙏

  • @lindermannla
    @lindermannlaАй бұрын

    Wowww, excelent tutorial! Thnxz!

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Happy to heaar Leonardo

  • @MohamedAbdulRaouf
    @MohamedAbdulRaoufАй бұрын

    Super as always, thank you Rainer form Egypt 🙌

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Thanks a lot Mohamed and best wishes from to Vienna (🇦🇹) to the land of the pyramides (🇪🇬) 👍

  • @ShiftedBit
    @ShiftedBitАй бұрын

    That's an important issue you are showing here. Thank you for that. I think i will stick with rxjs on the data layer and use signals in components only. I may try out a signal store for state management. Currently I am quite happy with rxAngular StateManagement and event driven reactivity.

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Serwas Markus, yeah so using Signals in the templates is definitely a safe bet. I don't think that we have to use RxJs all the time. There are quite a lot of applications out there who might be well off with relying only on Promises but you need to know when Promises aren't sufficient anymore and you need to level up. I intend to come up with a video on that topic. It is not easy one. Although I have very good connections to the RxAngular team, I still haven't tried it out. Shame on me 😅

  • @ShiftedBit
    @ShiftedBitАй бұрын

    @@RainerHahnekamp I know it sounds odd, but do you think it would make a difference to wrap the promise into an observable and embed it to the computed with toSignal()?

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    @@ShiftedBit I don't know, you could try it out if you want to. I've added the link to the repository. But as I said in the video, it must not concern you that you might miss the intermediate change where the holidays are emptied. If it does, that don't use a Signal for the holidays but an Observable. "The problem" is not the Promise, but the Signal itself which skips some values (glitch-free).

  • @marcwinner567
    @marcwinner567Ай бұрын

    @@RainerHahnekamplooking forward to that video sir 🎉

  • @murhafsousli7191
    @murhafsousli7191Ай бұрын

    Great tutorial, thanks!

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    You are welcome!

  • @vutruong4164
    @vutruong4164Ай бұрын

    Thank you for the bombshell video Rainer! While these Signal APIs vastly simplify how components/directives React to Changes, I feel that we still have not arrived at a good pattern for the Initialization phase of components/directives using Signal APIs. Scheduling Initialization in constructor using the afterNextRender() seems to be the most sensible approach for me, with the added benefit of being SSR-friendly I also tried setting up Initialization using effect() and untracked() but in the end it felt a bit "unsafe" because effect execution is asynchronously dependent on Change Detection Scheduling, which we have very little control over. I am also concerned about when the executed effect is itself an asynchronous fetch, like in your demo (the async search function). ngOnInit, on the other hand does not have access to viewChild() and contentChild(), unless these queries are marked static. Perhaps you can provide more insight regarding the advantages/disadvantages of the above approaches in future videos, when best practices emerge!

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Hey, it sounds to me like you are afraid of loosing the control over things? I don't see it that way to be honest. Yes, an effect runs asynchronously but if it triggers a side-effect which is also asynchronous (e.g. HTTP request), it doesn't change anything. I was never in control of an HTTP request either. Would it be possible to elaborate your issue a little bit? Can you think of a use case where the new API might be a problem? --- I would be careful when it comes to afterNextRender and SSR. It is not executed on the serve. So your rendered page might be missing crucial content. --- Cheers!

  • @vutruong4164
    @vutruong4164Ай бұрын

    I would say it's the timing of the availability of various component signals during the initialization that causes me some confusion. Like if I tried to 1. read an input.required() signal, 2. then fetch some data in an effect(), 3. and then use that data to populate a 3rd-party chartJS node in the DOM using viewChild() => I'm not exactly sure where should I schedule this chain of behaviour, because input.required() cannot be read too early in the constructor (input not yet available error would be thrown), while effect() itself must be scheduled in an injection context (constructor or field declaration), when viewChild() result definitely is not yet available in constructor. With decorator based approach, I would say ngOnInit for reading @Input and fetch data, then afterViewInit for populating chartJS DOM node. I'll need to study that part of your video again to familiarize myself with these new timings. Thanks

  • @VladiSecuritas
    @VladiSecuritasАй бұрын

    voice sound quality is really bad.. please use a proper mic.

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Yes sir, threw it away after that one and working with a wireless. You can see the difference in the second part.

  • @gaborballa9614
    @gaborballa9614Ай бұрын

    wow, thank you! this video is very simple to understand for anyone. I recommend it!

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    Thanks a lot!

  • @pawezysk3404
    @pawezysk3404Ай бұрын

    Best Angular tRainer ;)

  • @RainerHahnekamp
    @RainerHahnekampАй бұрын

    THANK YOU!