Вызов действия контроллера из представления в Ember

У меня есть кнопка отправки с событием просмотра onClick. Это событие проверяет флаг и в зависимости от условия, которое оно разрешит отправкой формы. Мне бы хотелось, чтобы действие submit на контроллере вызывалось. Каков наилучший способ сделать это?

Ответ 1

Здесь другое решение, основанное на примере albertjan для случая, вам нужно выполнить некоторую логику в вашем представлении, а затем делегировать ваш контроллер. Так я понял ваш вопрос:

HBS:

<script type="text/x-handlebars" data-template-name="index">
    <button {{action submit target="view"}} >Sumbit</button>
</script>

Вид:

App.ThingView = Ember.View.extend({
    submit : function(){
            //do the view part of your logic
        var object = //do whatever you may need
        this.get("controller").send("submitInController", object); //you do not have to send object, if you do not need to
    }
});

Контроллер:

App.ThingController = Em.ObjectController.extend({
    submitInController: function(model) {
        // do the controller part of your logic
    }
});  

Примечание.. Вызов с вашего вида также будет зависеть от вашего текущего маршрута. Таким образом, это в основном тот же код, что и ember выполняется при использовании помощника действий.

Ответ 2

Я бы обработал все событие на контроллере:

HBS:

<script type="text/x-handlebars" data-template-name="index">
    <button {{action "submit"}}>Sumbit</button>
</script>

Контроллер:

App.ThingController = Em.ObjectController.extend({
    submit: function() {
        //handle things here!
        //change the state of your object here to reflect the changes that
        //the submit made so that the view shows these.
    }
});                   

Ответ 3

В Ember версии 1.0.0 у меня было успешное добавление действий в их собственный литерал объекта в контроллере.

IndexTemplate.html

<script type="text/x-handlebars" data-template-name="index">
    <button {{action "submit"}}>Submit</button>
</script>

ThingController.js

App.ThingController = Ember.ObjectController.extend({
    actions: {
        submit: function() {
            //handle things here!
            //change the state of your object here to reflect the changes that
            //the submit made so that the view shows these.
        }
    }
});

Для получения дополнительной информации ознакомьтесь с {{action}} вспомогательной документацией из Ember Guides.

Ответ 4

Вы можете вызвать действие из представления, если в представлении используется ViewTargetActionSupport mixin. Следующий пример демонстрирует его использование:

App.SomeController = Ember.Controller.extend({
    actions: {
        doSomething: function() {
            alert('Doing something!');
        }
    }
});

App.SomeView = Ember.View.extend(Ember.ViewTargetActionSupport, {
    someMethod: function() {
        this.triggerAction({action: 'doSomething'});
    }
});