2013-09-17 5 views
23

У меня есть этот видember.js, вызвать действие программно

App.ApplicationView = Em.View.extend({ 
    templateName: 'application', 

    actions: { 
     myAction: function() { 
     // 
     } 
    } 
    }); 

Предположим, что я хочу, чтобы вызвать вручную, что действие от другого метода представления, такие как didInsertElement, как:

App.ApplicationView = Em.View.extend({ 
    templateName: 'application', 

    actions: { 

     sidebarShowHome: function() { 
     this.set('sidebarIsHome', true); 
     this.set('sidebarIsNotifications', false); 
     this.set('sidebarIsArchive', false); 
     }, 
    }, 

    didInsertElement: function() { 
     this.actions.sidebarShowHome(); 
    } 
    }); 

Как мог Я делаю это? this.actions не определено из метода просмотра.

ответ

23

Вы можете использовать TargetActionSupport подмешать вместе с this.triggerAction:

App.ApplicationView = Ember.View.extend(Ember.TargetActionSupport, { 
    templateName: 'application', 
    actions: { 
    myAction: function() { 
     console.log('myAction'); 
    } 
    }, 
    didInsertElement: function() { 
    this.triggerAction({ 
     action:'myAction', 
     target: this 
    }); 
    } 
}); 

По умолчанию с помощью this.triggerAction() без параметров будет посылать действие на контроллер, однако, если вы должны быть ориентированы на различные назначения определяют параметр target, как показано в примере.

demo.

Надеюсь, это поможет.

+0

Спасибо, отлично! –

+1

@intuitivepixel Есть ли способ передать аргумент в действие? –

+0

@JonKoops, чтобы действительно передать аргументы, вы должны использовать контекст и контроллер, которые можно передать: http://emberjs.com/api/classes/Ember.TargetActionSupport.html#method_triggerAction и получить оттуда нужные значения/params и т. д. – intuitivepixel

12

Метод triggerAction() только существует, если вид использует смесь Ember.TargetActionSupport. Если это не так, используйте вместо этого this.get('controller').send('action');.

+1

triggerAction() полностью существует. Вы неправильно читаете вопрос: this.get ('controller'). Send ('action') вызывает действие, объявленное в объекте action внутри контроллера, triggerAction() используется для запуска действия из одного и того же представления, которое это вопрос. –

+0

triggerAction не существует - если вы не используете смесь Ember.TargetActionSupport – nont

+1

'triggerAction' существует, но, конечно, имеет смысл использовать [' send'] (http://emberjs.com/api/classes /Ember.Controller.html#method_send). – wbyoung

12

Для вызова действия в том же контроллере вы можете использовать send.

this.send('nameOfAction', someParams); 

Для того, чтобы вызвать действие в родительском контроллере из компонента использования sendAction.

this.sendAction('nameOfAction', someParams); 
+0

ДА! Спасибо тебе за это. Мне действительно жаль, что они просто не добавили sendAction к контроллерам, потому что это намного более описательно. – Ravenstine

Смежные вопросы