Тёмный

Sharing Data between Components in Angular 

Fireship
Подписаться 3,3 млн
Просмотров 496 тыс.
50% 1

Fully documented lesson at angularfirebas...
In this episode, I am going to show you four different ways to share data between Angular components.
Parent to Child the Input Decorator
When you declare a variable with the Input decorator in the child component, it allows that variable to be received from a parent template. In this case, we define a message variable in the parent, then use square brackets to pass the data to the child. Now the child can display this data in its own template.
Child to Parent via ViewChild
ViewChild allows a one component to be injected into another, giving the parent access to its attributes and functions. One caveat, however, is that child won't be available until after the view has been initialized. This means we need to implement the AfterViewInit lifecycle hook to receive the data from the child.
In the AfterViewInit function we can access the message variable defined in the child
Child to Parent via Output and EventEmitter
Another way to share data is to emit data from the child, which can be listed to by the parent. This approach is ideal when you want to share data changes that occur on things like button clicks, form entires, and other user events.
In the child, we declare a messageEvent variable with the Output decorator and set it equal to a new event emitter. Then we create a function named sendMessage that calls emit on this event with the message we want to send. Lastly, we create a button to trigger this function.
In the parent, we create a function to receive the message and set it equal to the message variable.
The parent can now subscribe to this messageEvent that's outputted by the child component, then run the receive message function whenever this event occurs.
Share data between any components
When passing data between components that lack a direct connection, such as siblings, grandchildren, etc, you should you a shared service. When you have data that should aways been in sync, I find the RxJS `BehaviorSubject` very useful in this situation. The main benefit that a BehaviorSubject ensures that every component consuming the service receives the most recent data.
In the service, we create a private BehaviorSubject that will hold the current value of the message. We define a currentMessage variable handle this data stream as an observable that will be used by the components. Lastly, we create function that calls next on the BehaviorSubject to change its value.
The parent, child, and sibling components all receive the same treatment. We inject the DataService in the constructor, then subscribe to the currentMessage observable and set its value equal to the message variable.
Now if we create a function in any one of these components that changes the value of the message. when this function is executed the new data it's automatically broadcast to all other components.
That's it for data sharing. See you next time.

Опубликовано:

 

1 окт 2024

Поделиться:

Ссылка:

Скачать:

Готовим ссылку...

Добавить в:

Мой плейлист
Посмотреть позже
Комментарии : 373   
@zlatanonkovic2424
@zlatanonkovic2424 5 лет назад
0:07 parent => child - via Input() 0:42 child => parent - via Output() + EventEmitter 2:12 child => parent - via ViewChild() 3:01 Any => Any - via a shared service Thanks a lot for that great video!
@tariqboukouyen4841
@tariqboukouyen4841 5 лет назад
Useful YO
@DividedStates
@DividedStates 5 лет назад
awesome quick reference
@sivakumarg98
@sivakumarg98 4 года назад
😂 🤟🙏
@davidj5284
@davidj5284 2 года назад
It is a shame the content creator didn't think to do this. This is what makes great content. Indexing the f*ing thing.
@avinashsuresh5221
@avinashsuresh5221 22 дня назад
2:12 is really for parent to access its child(ren).
@MaDaaBre
@MaDaaBre 7 лет назад
The best explanation I've seen for Angular. Helped me finally understand cross component communication once for all! Thank you!
@Fireship
@Fireship 7 лет назад
thank you!
@silaslumba8111
@silaslumba8111 7 лет назад
Body painting
@tayfoooooor
@tayfoooooor 6 лет назад
Yup exactly all in one, simple explanation (Y)
@Legotron
@Legotron 6 лет назад
Bank5z0rSqt absolutely it is! I had that AH-HA moment.
@MaylorTaylor
@MaylorTaylor 5 лет назад
I agree with this comment.
@squarebynature
@squarebynature 7 лет назад
Best short, concise and to the point video on the internet about data cross communication in Angular, period. Thanks so much !!!
@Fireship
@Fireship 7 лет назад
Thank you! Let me know if there are any other Angular topics you want to see on the channel.
@squarebynature
@squarebynature 7 лет назад
more on observables inside Angular would be awesome!
@umka7873
@umka7873 6 лет назад
need urgent explanation errorHandler!)) new Ng 6+
@beginner2expert
@beginner2expert 5 лет назад
You can try this example as well: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-95ulyFS0eLo.html
@Akshay-Malthane
@Akshay-Malthane 5 лет назад
For background music i watched this video for several of times.. Please let me knw the name of that music
@elisolna
@elisolna 7 лет назад
This is by far the *BEST EXPLANATION* about data sharing in angular, i'v seen a lot of videos about it, but no one explains it as simple and straightforward like you, Keep Up the good work mate!
@Fireship
@Fireship 7 лет назад
Thank you!
@stevenskharisachaesquerre5080
@stevenskharisachaesquerre5080 11 месяцев назад
it's been 6 years and it's still helpful, thx for doing this
@RafaelFerreira182
@RafaelFerreira182 4 года назад
Is it a good approach to do unsubscribe in ngOnDestroy of all components that are doing subscribe to get the current message?
@Jopie65
@Jopie65 6 лет назад
The last example caused a leak! The subscription was *not* captured and unsubscribed on component destruction. It's better to avoid explicit subscription from typescript code and let Angular manage subscriptions itself by using the async pipe in the template.
@phuduc1193
@phuduc1193 7 лет назад
I rarely comment anywhere but this is amazing.. fast, short, easy to understand and just on point. Thank you so much.
@Fireship
@Fireship 7 лет назад
Thank you, I appreciate that!
@icasemobileservicecenter3293
@icasemobileservicecenter3293 5 лет назад
how to child => parent don't need Output() + EventEmitter?
@HusseyCarl
@HusseyCarl 7 лет назад
You should really consider a doing course on angular basics, paid even. - I think your explanations are great and this was very easy to understand. I have watched this a few times now when I get stuck looking for the best way to communicate. I also like the music :)
@Fireship
@Fireship 7 лет назад
Thanks for the feedback! I am actually working on an end-to-end course that should be ready in 2 to 3 weeks from now, so stay tuned for that.
@saikiranmarripati7743
@saikiranmarripati7743 5 лет назад
@@Fireship is the course ready yet?
@neroprox
@neroprox 6 лет назад
For all using angular 5. Remember to import the DataService and set is as a provider in your module. like this: ...... import { DataService} from './data-service'; @NgModule({ declarations: [ AppComponent, ConversationComponent, CanvasComponent ], imports: [ BrowserModule, FormsModule ], providers: [DataService], bootstrap: [AppComponent] })
@dadandgirls7306
@dadandgirls7306 2 года назад
Thanks, that's the piece I was missing. Note that in my case, the import was slightly different than what you show: import { DataService} from './data.service';
@nodarii
@nodarii 7 лет назад
the secret of good video is in background music. Chill out and relax with so technical stuff :) Good job
@Fireship
@Fireship 7 лет назад
+Nodarii Thank you! I have had mixed reviews about the music, so glad to hear you enjoy it.
@ibrahimmohammed3484
@ibrahimmohammed3484 6 лет назад
i like listening to it too while he is coding xD
@scyyyy
@scyyyy 6 лет назад
can you ID the background music it for me? I know it's a pretty short loop but anyways, sounds like amazing chill out I could listen to all day :D
@dumindudesilva083
@dumindudesilva083 4 года назад
I'm with Nodarii too. It's cool...
@diegomen
@diegomen 4 года назад
@@Fireship Very good explanation and the music for programming is great. What is the name of the artist and song? give some credit :)
@johnragica1723
@johnragica1723 6 лет назад
Thanks! The information in this video tutorial are very important to me as a newbee in angular. Liked and subscribed.
@isakgranqvist9306
@isakgranqvist9306 5 лет назад
Great tutorial. The last example was exactly what I was looking for. Awesome!
@aurorashen1022
@aurorashen1022 3 года назад
Thank You So Much for this!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@qazyhn94
@qazyhn94 6 лет назад
I recreated the example and didint use BehaviorSubject but just made setter and getter for the value in service. It still updates all of other not related components. Why? And why we need make it observable what benefits?
@TerjeNesthus
@TerjeNesthus 5 лет назад
This is really cool, just what I would need to update my navbar component to indicate changes done in another component.. thanks for making this
@mtsurov
@mtsurov 5 лет назад
where can i get this soundtrack ? I'm addicted to it . Seriously, it helps me study more than you know.
@beginner2expert
@beginner2expert 5 лет назад
You can try this example as well: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-95ulyFS0eLo.html
@inobrega
@inobrega 6 лет назад
Many Kudos to this tutorial! Love this BG music... relaxing!
@beginner2expert
@beginner2expert 5 лет назад
You can try this example as well: ru-vid.com/video/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE-95ulyFS0eLo.html
@eliasrodas7336
@eliasrodas7336 7 лет назад
Awesome video!! Really helped me understand what I was missing! Thank you very much!!
@amitprajapati3383
@amitprajapati3383 6 лет назад
this is best explanation, but on refreshing sibling component shared data is getting lost. Please help if any one have solution
@MrTrakjojo
@MrTrakjojo 5 лет назад
same question here :(
@hiddenNinja_KD
@hiddenNinja_KD 7 лет назад
Nice tutorial for communicating among components! :) It gave me new ideas for implementing sessions, thumbs up!
@Fireship
@Fireship 7 лет назад
Thank you, good luck with your project.
@jitujahagirdar613
@jitujahagirdar613 5 лет назад
Really Nice and quick video. Exactly i was looking for same. Thanks You..! for this super video. Really like it.
@venkatbhushan4321
@venkatbhushan4321 6 лет назад
you are awesome! however, request you to reduce the intensity of the background music- thank you so much for a beautiful tutorial BTW.
@ibknl1986
@ibknl1986 6 лет назад
One of the best training way. Not sure how but your voice + training video + methodology make it super clear. Great going
@Ghaniballx
@Ghaniballx 7 лет назад
Why assign BehaviourSubject instance to a new public property? I mean this line(3:40 in video): > currentMessage = this.messageSource.asObservable(); Isn't "messageSource" already an observable?
@Fireship
@Fireship 7 лет назад
Good question. That's actually a "best practice" to prevent new values being pushed to the BehaviorSubject from outside the service. Completely optional though.
@petermen9914
@petermen9914 3 года назад
It's 2021 but that was exactly what I need
@kayldomaj6493
@kayldomaj6493 3 года назад
Perfectly clear, thank you. I didn't know about the rxjs way. Only thing is that you now need to import from 'rxjs' instead of 'rxjs/...'
@MisterCuriousController
@MisterCuriousController 4 года назад
hi, I just saw this tutorial today in 2020. I think the last part has problems for the latest angular. I kinda cant work the data servince using obserbables.
@glacial_chinchilla
@glacial_chinchilla 6 лет назад
This got me through a problem I've been tackling for two days. Big thanks!
@stefanoslalic2199
@stefanoslalic2199 5 лет назад
Never stop what you are doing, you are genius
@heenachoudhary9091
@heenachoudhary9091 5 лет назад
Simple and short explanation of the concept.. Thankyou for making such a informative video.
@davesharp5472
@davesharp5472 5 лет назад
This channel in general has been the most helpful thing for me learning angular compared to anything else. I'll watch the same video 5 times to get all the info since there's no much packed in there but its clear and concise. Thank you for doing this.
@prasadchaugule
@prasadchaugule 6 лет назад
This is what exactly I was looking for. Very nicely explained. Thanks!
@דבירגמליאל-ת8כ
@דבירגמליאל-ת8כ 3 года назад
For Angular 7+ can be used: import {BehaviorSubject} from 'rxjs'; And not use in: import {BehaviorSubject} from 'rxjs/BehaviorSubject'; stackoverflow.com/questions/36701041/cannot-find-module-rxjs-subject-behaviorsubject
@SylDreams
@SylDreams 4 года назад
If you have the error for rxjs import { BehaviorSubject } from 'rxjs/internal/BehaviorSubject';
@brandoncluff6696
@brandoncluff6696 6 лет назад
This was great - the first time that Angular made sense to me. Thank you!
@jacksonjohn9769
@jacksonjohn9769 7 лет назад
While doing sibling communication I found like, when we call the service on ngint it always fair service . And old value will be there always. and whenever the page load we need to check whether the item form service is null or not. Anyway we can avoid this. I want event the to fire when i needed. for example - ngOnInit() { this.locationEventDistributorService.getSelectedLocationSection() .subscribe(item => this.getLocationSectionInfo(item)) } getLocationSectionInfo(item) { if(item!=null){} }
@marlenehasslinger2126
@marlenehasslinger2126 5 лет назад
Thanks so much for this video! It made everything very clear in just a little over 5 minutes
@avinashsuresh5221
@avinashsuresh5221 22 дня назад
My preferred application architecture: 1. Global Context 2. Private Components 3. Shared services 4. Component interaction only through shared services 5. Shared services managed through one global context manager.
@jonatacardoso6439
@jonatacardoso6439 7 лет назад
BEST EXPLANATION about data sharing in angular!!
@remiduplan8449
@remiduplan8449 6 лет назад
hi , i am trying to pass objects between two components that aren't child/parent. In the exemple it is shown for a single string. In the case of an objet there is no 'subscribe' method neither 'next' method that can be apply ... how can I send and receive an object ? (in my case it s a a bout changing the theme/ colors / icon colors).... and I have three levels of component : 1st : app. component, 2nd : page. component (where I want to receive the theme object), and 3rd : setting component (where i set the theme )... (it seems that 'settings' is a child of 'page' but is not because in page I have header and sidebar, and my settings is not display all the time (so I suppose it get shut down) ) .... does anyone has an idea ... even a precise way to do it ? thank you girls and guys.
@DeathBender
@DeathBender 4 года назад
methods 1-3 work for inline templates, method 4 works for template-urls but incorporates a service (well usually you have to have a service connected to a database anyways) "amirite" ? Thanks for the vid anyways and nice sounds !
@hamletpena1191
@hamletpena1191 4 года назад
Hello i was trying to implement behaivorSubject in my service but i cold find a problem : you are using both siblings direct in app.component but when i am trying to implement router-oulet both siblings can´t work . the sibling one when update the data the sibling two can not make the update . My question is someone know how can i fix this problem. ?
@chri-k
@chri-k 4 года назад
What is the reason why you shouldn’t use Document.getElemetbyId(...).DispatchEvent(event) I know you shouldn’t use it, but why???
@adhivenkatesh3431
@adhivenkatesh3431 5 лет назад
Hi nice video , thank you!., How to show global error , best to show the error in HTML file , i am unable to find anywhere , if you have the concept please help me with git-hub repository or any you tube , thanks.
@gaongake9146
@gaongake9146 4 года назад
hey hey hey FireShip, you are one of the best explainer when coming to angular.damn you explained everything and made that easy in a clean and pure way.Fuck it i am downloading this Video.😭😭
@architadesai7876
@architadesai7876 6 лет назад
Thank you so much for this explanation. Yours is the best channel on Angular!
@yagolopez6186
@yagolopez6186 6 лет назад
Why do not just use a simple variable in a service instead of an observable? Here's a link with a working example: angular-jqrnda.stackblitz.io
@donwald3436
@donwald3436 4 месяца назад
Can you update this for the new thing in Angular 16 was it shared() or store() or s-something I forget, tell us why we don't need ngrx?
@EvilTim1911
@EvilTim1911 5 лет назад
I was following along fine until RxJS came up. My god why is this whole reactive thing so unintuitive
@EvilTim1911
@EvilTim1911 5 лет назад
Well, 2 months later and I've become pretty proficient in RxJS and Angular in general. So if you read my comment, just know that it gets pretty easy to understand when you keep using observables and discover their usefulness. It gets better, fellow beginner programmers!
@rayav1065
@rayav1065 6 лет назад
This video really helped me a lot! Really like the last architecture with the service and observables!
@delta4v
@delta4v 6 лет назад
Very helpful, thank you so much! Subscribed!
@erwinmesi
@erwinmesi 6 лет назад
Have just decided to watch all your videos from the beginning
@Fireship
@Fireship 6 лет назад
Thank you for the feedback :)
@paymankhayree8552
@paymankhayree8552 4 года назад
why do we need to use *asObservable()* methode? isn't the *behavoiurSubject* already wrapped in an *Observable* ?
@mohammedelhadididi4612
@mohammedelhadididi4612 3 года назад
Why did you use the asObservable() method ? Couldn't you just subscribe to the behavioral subject directly ?
@chetanpl
@chetanpl 4 года назад
this.data.currentMessage.subscribe(message=>this.message=message); There are 2 message this.message=message 1. this.message 2. message Please tell me from where you set the =message I am getting error
@webmandman
@webmandman 3 года назад
Would you guys share data via a shared service for components unrelated to each other, for example, components in different routes?
@ganesanshan
@ganesanshan 6 лет назад
I am using third method and I am able to pass data from a component to the service but not able to get the data in another component. Note: I am using Angular 5. Please help
@carolinavega159
@carolinavega159 7 лет назад
Awesome! This helped me a lot, thank you!
@sametbaskc3768
@sametbaskc3768 6 лет назад
is it good way to store logged-in user model in behaviorsubject? Should we use this for this intention?
@rhoumafoudhaili8362
@rhoumafoudhaili8362 6 лет назад
really helpful
@GermanEmmanuel
@GermanEmmanuel 6 лет назад
Whit the Shared Service method, I get the 'ObjectUnsubscribedError' when navigate to another view ( actually I used unsubscribe methods to try to fix this, but doesn't work)
@Jopie65
@Jopie65 6 лет назад
German Emmanuel Indeed! He forgot to capture the subscription and unsubscribe during component destruction. That's bad! You'd better not subscribe to an observable (or subject) explicitly from typescript code. You better let Angular manage subscriptions via the async pipe in the template. E.g. {{ myService.mySubject$ | async}}
@rajdeepsingh4462
@rajdeepsingh4462 4 года назад
You Are Very Great. Now I can do Component Communication.
@deborahjamesmathew
@deborahjamesmathew 3 года назад
thank you so much !!! Was able to subscribe to shared data in a service from multiple components.
@TonyAlcast
@TonyAlcast 6 лет назад
Most clare and undestandable explanation, even not in my native language (lol). Thanks for these tutorials and just wondering, how is the bgm of your video called?
@SachalChandio
@SachalChandio 11 месяцев назад
you are awesome can you also talk about signals and effects and new things in angular like standalone components that makes things easier
@Felix-og7pd
@Felix-og7pd 2 года назад
parent - child (input) child - parent (output + eventEmitter) any - any (rxjs)
@frankeinstein719
@frankeinstein719 5 лет назад
How come no one wants to explain what are childs and parents components? I could not find any info on this on the internet.
@urazem9388
@urazem9388 5 лет назад
Cheers! Thank you so much:) you are cool!!!:D
@saoudiwalid
@saoudiwalid 6 лет назад
Short and straight to the subject, I loved it.
@mopsydaisy
@mopsydaisy 6 лет назад
This saved my live. Thanks!
@TheunisCilliers
@TheunisCilliers 7 лет назад
Absolutely great video! I'm getting the component with which I trigger 'next' to consume the service, but others, whilst compiling fine and not complaining about anything, it doesn't subscribe. I've just put a static string in a console.log function and inside the sibling or non-relational components that isn't displayed ... only on page load. But not when 'next' is called. Any ideas where I might be going wrong?
@hussain5755
@hussain5755 6 лет назад
explaining is an art and this guy is the picasso of that art..kudos
@Fireship
@Fireship 6 лет назад
Thank you! Hope to make more videos like this soon.
@ShobhitGupta12
@ShobhitGupta12 6 лет назад
Do you see any issues with using BehaviorSubject to communicate between components without using a service? I am imagining dialogs taking a response BehaviorSubject as input (so that it can respond with the results OK or Cancel), and any component that implements that dialog would basically have to supply a BehaviorSubject to the dialog. Do you see any issues with that?
@ottocheley7852
@ottocheley7852 5 лет назад
How did you become such a pro in Angular :0?
@ccalmus
@ccalmus 5 лет назад
can I access child components variable (using the ViewChild) even when the function is triggered from parent's side? Explaining - child component has a state (in terms like whatever is stored in one of its variables that I am interested in) and I want to access this child's variable from parent upon btn click inside the parent element. Is it possible? I would say it is but still :D
@andhraTejanc
@andhraTejanc 7 лет назад
how to pass data between components when they are in linked with routing without using router params?
@zeherbouzid6835
@zeherbouzid6835 3 года назад
thanks for the video simple and clear
@idlevandal69
@idlevandal69 5 лет назад
With the @ViewChild example I was getting 'Expression has changed after it was checked' error in the console, after checking the docs ngAfterContentInit runs after ngDoCheck(), I used this and the error went away.
@nickbunich3165
@nickbunich3165 3 года назад
Great stuff i really liked the format! I think it might makes sense to add ng-content to the list
@medsalemdeddah8853
@medsalemdeddah8853 4 месяца назад
Does this work for RouterOutlet components? like to component who are in different routs ?
@mgs_4k198
@mgs_4k198 6 лет назад
Simplicity is a beautiful thing. Thank you
@maverickjaodat
@maverickjaodat 3 года назад
the background music is so annoying .... cant hear what you are saying !!! :@
@DividedStates
@DividedStates 5 лет назад
0:37 always the same when people are explaining this, they use the same name and than you have something like [message] = "message". and that is then references without brackets or quotation marks somewhere else and you have a hard time, which to put in curly brackets in the child. 4:38 Here again: is this 'data' and 'DataService' your name for the service or a rule? when you write "this.data." it refers to the name of the service which is called data.service, right? And when you write DataService it is a predefined name like component or onInit? How do you handle multiple services.
@khmermobiletv
@khmermobiletv 7 лет назад
Thank you for sharing this video but It does not work with angular 4 router. If you have multiple components and hook up with router, the sharing data across children component. It always return null. Some how the routers keep loading service like controller.
@PrezentareMachete64
@PrezentareMachete64 6 лет назад
to the point but too fast without some small important details like the infrastructure of the project and how they are related to each other
@astizar.d
@astizar.d Год назад
is possible to receive data from another component without any trigger in receiver component?
@swagatpatra2139
@swagatpatra2139 6 лет назад
It would be better if you could name the child and parent variables differently like childMsg instead of using message for all..Anyways, great video!!
@Aliana9603
@Aliana9603 10 дней назад
Thanks, that was a quick and good refresher on data sharing in Angular!
@octavian3033
@octavian3033 2 года назад
Awesome stuff. Especially the last part (Child->Child sharing). I still find it odd that Angular's documentation doesn't cover sharing data between unrelated child components.
@fewicharlie
@fewicharlie 6 лет назад
This is amazing. I've been watching your videos since yesterday and I learn something new in each of them. Keep it up!!
@pradeepkumarnm7127
@pradeepkumarnm7127 6 лет назад
( my self being newbie to angular) ...Amazing.... tutorial... Am I the only who took more than 15 min to capture and understand. Really gives some work to brain apart from just seeing
@midassibayram8860
@midassibayram8860 6 лет назад
A really interesting Tutorial, one of the bests that I watched, but I think it is really a little bit fast for Angular beginners like me :-p, It wouldd be really perfect if you do it a little bit slowlier. But really thanks, I could finally understand how the communication between components works.
@thedarkside0007
@thedarkside0007 3 года назад
can i just used behavior subject instead of @input and @ouput or this is a bad practice ?
@abduljabbarazam943
@abduljabbarazam943 6 лет назад
I've spent many hours looking for cross component communication in the angular docs. Giving up on that and using google I came across this video. I now understand it. Thank you.
@siddharthbehra5250
@siddharthbehra5250 3 года назад
God bless you and your family. The explanation along with the background music was great. So helpful. :) Appreciate the great work man, keep it up!
@Saurav192
@Saurav192 5 лет назад
After watching this my mouse pointer automatically went to the subscribe button and clicked it
@tayfoooooor
@tayfoooooor 6 лет назад
Yesss!!, that's exactly what I look for, you covered all way of communication, I specially search for sibling communication, Thank so much! :D
Далее
OBSERVABLES, OBSERVERS & SUBSCRIPTIONS | RxJS TUTORIAL
17:40
The Async Await Episode I Promised
12:04
Просмотров 1,1 млн
How To Make AWS Not Suck
6:38
Просмотров 560 тыс.
We're on the brink of another world browser war
4:29
Front-end web development is changing, quickly
3:43
Просмотров 1,1 млн
Reactive Forms  - The Basics
15:48
Просмотров 256 тыс.