Hello, can I broadcast an event from a view/component which I can listen to anywhere?
In my case, I want to trigger an event on a view and then listen to it on every component that has been added. I added a jquery handler on the body and capturing that event whenever triggered on each component, but is there a better way of doing it by banking on the Ember.Evented mixin’s trigger method?
1 Like
If I understood you correctly, when triggering an event, you can save updated state in your component controller.
Then observe your controller variable ('controllers.yourcomponentcontroller.state'
) from another controller you wish to update.
What muchweb said is correct if all you need to do is observe state that changed because of some other component’s action. However, I can see how that wouldn’t be enough, so I offer this alternative:
I’m afraid that emitting actions from your controller that the component listens to isn’t easy. Making a view listen is relatively easy:
App.ListeningView = Ember.View.extend({
didInsertElement: function () {
this.get('controller').on('emittedAction', function () {
// do stuff
});
}
});
App.SomeController = Ember.Controller.extend(Ember.Evented, {
actions: {
'emittedAction': function () {
this.trigger('emittedAction');
}
}
});
Do you see why this wouldn’t work for components? Components have no way of getting at their controller to register .on('emittedAction')
.
Docs about this.
Yes and that is why I was asking this question. Since i wanted to write a standalone component, I wanted to capture an ‘escape’ event outside the component, with the user only needing to just trigger an event. This is why i wanted to capture it inside a component.
Gotcha. Sorry to say I don’t know of a good method in that case. It’s possible that the creators of the components didn’t intend for them to easily listen to events, so a hack might be needed.
It seems to me you could just pass in a source of events when you define the component.
{{x-component listenTo=controller}}
And the opposite of course being:
{{x-component broadcastTo=controller}}
And then you just use those properties inside the component to listen to or trigger events.
Is there any documentation for this? I could not find it anywhere.
There’s documentation for using events in ember here: Evented - 4.6 - Ember API Documentation
listenTo
and broadcastTo
are just names of properties; they don’t do anything by default in components.