简体   繁体   中英

Ember.js - How to trigger view method from controller?

I'm trying to call view method from controller, but no idea how to do this. From view I can easily call controller method like this.get('controller').send('method');

How to do something like that from controller this.get('view').send('method'); ?

To give you better overview what I'm trying to do.

I have application controller Ember.Controller.extend({}) I have application view Ember.View.extend({}) and application template.

In application template is login form, when user submit it controller method is executed. In this method if login credentials are incorrect I need to call view method which is executing jQueryUI method on login form (shake method to be exact and showing some text).

This sounds like a good use for Ember.Evented . By using event subscription and dispatching you can avoid coupling your view and controller.

Simply mixin Ember.Evented :

Controller = Ember.Controller.extend(Ember.Evented)

Now you can call on and trigger methods on your controller, to subscribe to an event and then to kick off the event. So, in your view you might do:

didInsertElement: function () {
    this.get('controller').on('loginDidFail', this, this.loginFail);
}

And then in your controller call this.trigger('loginDidFail') to kick off your loginFail view method.

Remember to remove the handler after the view is dismissed... see the answer below.

Just wanted to answer on this question to address the issue with properly removing the listener if the view is cleared (when the route changes). It's also not necessary to use a jquery proxy, since the on/off methods support a target, which is good because unsubscribing a proxy is definitely more complicated. Revising what Christopher provided:

didInsertElement: function()
{
  this.get('controller').on('loginDidFail', this, this.loginFail);
},

willClearRender: function()
{
  this.get('controller').off('loginDidFail', this, this.loginFail);
}

Without removing the subscription any subsequent visits to the login route (without reloading the page) will add additional listeners; ie memory leaks, errors, and unexpected behavior.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM