Подтвердить что ты не робот

Отправка действий из компонента в маршрут в ember.js

Здесь маршрут:

import Ember from 'ember';

export default Ember.Route.extend({
    actions: {
        closeModal: function () {
            alert('asdf');
        }
    }
});

И код компонента js:

import Ember from 'ember';

export default Ember.Component.extend({
    actions: {
        closeModal: function () {
            this.sendAction('closeModal');
        }
    }
});

То, что я хотел бы сделать, - это (как может предложить код;)) отправить действие от компонента к маршруту, чтобы маршрут мог действовать на него. Однако приведенный выше код не работает - компонент правильно обрабатывает действие, но вызов sendAction внутри него не делает ничего.

EDIT:

Я решил эту проблему, используя:

this._controller.send('closeModal'); метод действия внутри компонента, однако это решение меня не удовлетворяет. Авторы Ember говорят, что контроллеры будут удалены в ember 2.0, поэтому в моем коде я не хочу иметь никаких ссылок на них. Предложения?

4b9b3361

Ответ 1

Компонент имеет изолированный контекст. Поэтому он ничего не знает о чем-либо (маршруте или контроллере) вне компонента. Чтобы отправить действие с вашего компонента на ваш маршрут, вы должны передать действие маршрута компоненту в своем шаблоне следующим образом:

// your template
{{your-component closeModal="closeModal"}}

Теперь, когда вы вызываете this.sendAction('closeModal') в своем компоненте, он вызывает действие, данное компоненту в вашем шаблоне, что в данном случае является действием closeModal вашего маршрута.

Дополнительные сведения см. в документах (http://emberjs.com/api/classes/Ember.Component.html#method_sendAction)

ОБНОВЛЕНИЕ 3 августа 2016 г.

Для тех, кто столкнулся с действиями закрытия в новых версиях Ember, вы также можете использовать такие действия здесь:

// your template
{{your-component closeModal=(action "closeModal")}}

Этот помощник действий укажет на действие вашего контроллера, в компоненте вы можете вызвать this.attrs.closeModal() или this.get('closeModal')(), чтобы вызвать действие вместо вызова sendAction.

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

В качестве побочного примечания действия закрытия всегда указывают на ваш контроллер, чтобы он указывал на действие маршрута, вы можете взглянуть на этот аддон: https://github.com/DockYard/ember-route-action-helper