EmberJS - рендеринг отдельного маршрута как модального в конкретную розетку

В моих приложениях EmberJS у меня есть два отдельных маршрута следующим образом:

Маршрут А - "основной/книги/добавить" Маршрут Б - "основной/авторы/добавить"

У меня есть кнопка «Добавить авторов» в шаблоне Route A, и когда пользователь нажимает эту кнопку, я хочу загрузить и отобразить Route B в модальном режиме, чтобы добавить новых авторов.

Я знаю, что можно добиться некоторой улыбки, используя метод рендеринга маршрута для рендеринга шаблона маршрута B и соответствующего контроллера. Но в этом случае хук «модель» маршрута B в файле «main/authors/add.js» не вызывается.

Было бы очень хорошо, если бы кто-нибудь мог предложить мне способ сделать отдельный маршрут модальным.


person PIKP    schedule 15.07.2015    source источник


Ответы (1)


EDIT. Несмотря на то, что это полностью верно (предпосылка рендеринга с использованием именованных выходов, представления теперь устарели в Ember 1.1. То же самое может быть достигнуто с помощью компонента

Да, вы можете сделать это:

Что вы хотели бы сделать, так это создать модальное окно в шаблоне и назначить ему именованный выход (или создать модальное представление с выходом):

in modal.hbs:

<div class='modal'>
    {{outlet "modalContent"}}
</div>

Затем я бы переопределил вашу базовую кнопку следующим образом:

App.BasicButton = Em.View.extend({
    context: null,
    template: Em.Handlebars.compile('<button>Click Me!</button>');
    click: function(evt) {
        this.get('controller').send('reroute', this.get('context'));
    }
});

И в вашем шаблоне настройте свою кнопку для запуска вашего модального окна:

in trigger.hbs

<!-- content and buttons for doing stuff -->
{{View App.BasicButton context='modalContent'}}

Наконец, вы хотите создать метод в своем маршруте, который обрабатывает рендеринг определенного контента в вашей розетке:

App.TriggerRoute = Em.Route.extend({
    actions: {
        reroute: function(route) {
            this.render(route, {into: 'modal', outlet: route});
        }
    }
});

Итак, по сути, вы визуализируете шаблон (называемый «modalContent») в определенный выход (называемый «modalContent»), размещенный в шаблоне/представлении (называемый «модальным»)

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

App.ModalView = Em.View.extend({
    didInsertElement: function() {
        this.$.css("display", "block");
        //whatever other properties you need to set to get the modal to pop up
    }
});
person Stephen Wright    schedule 15.07.2015
comment
Спасибо за быстрый ответ Fishbowl. Есть ли способ сделать это без использования представлений? что-то вроде прямого рендеринга маршрута к другому выходу. - person PIKP; 15.07.2015
comment
В любом случае, представления теперь устарели (я основывал свой ответ на старом сообщении в блоге, которое я написал). функции, либо в контроллере, либо в маршруте, вы должны иметь возможность делать то же самое, основная предпосылка рендеринга в именованный выход остается в силе. - person Stephen Wright; 15.07.2015
comment
Я боюсь, что функция перенаправления способна вызывать соответствующий маршрут с доступными крючками, такими как модель. - person PIKP; 15.07.2015
comment
Нельзя ли просто загрузить отдельный маршрут к конкретной розетке? - person PIKP; 15.07.2015