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

EmberJS: как перейти на маршрутизатор от действия контроллера

У меня есть действие:

{{action create target="controller"}}

который я нацелил на связанный контроллер (а не на маршрутизатор) следующим образом:

App.AddBoardController = Ember.Controller.extend
    create: ->
        App.store.createRecord App.Board, {title: @get "boardName"}
        App.store.commit()
        //TODO: Redirect to route

Как перенаправить обратно на маршрут из действия контроллера?

4b9b3361

Ответ 1

На самом деле, это не Эмбер идиоматический. Из того, что я знаю, и что я узнал от самого Тома Дейла, вот несколько замечаний по поводу этого кода:

  • Во-первых, вам не следует переходить из другого места, кроме внутреннего маршрутизатора: тем самым вы подвергаете себя серьезным проблемам, так как вы не знаете, в каком состоянии находится маршрутизатор, поэтому для того, чтобы поддерживать работу, вы быстро получите чтобы ухудшить ваш дизайн, и, кстати, общее качество вашего кода и, наконец, стабильность вашего приложения,
  • Во-вторых, содержимое действия, которое вы показываете, должно находиться внутри маршрутизатора, чтобы избежать нежелательного выполнения контекста. Маршрутизатор действительно является способом обеспечения последовательного поведения для всего приложения, причем действия обрабатываются только в определенных состояниях. Пока вы выполняете реализацию действий в контроллерах, эти действия можно вызвать в любое время, включая неверные...
  • Наконец, контроллеры Ember не нацелены на то, чтобы сдерживать поведение, поскольку они скорее являются добавочными обертками, содержащими в основном вычисляемые свойства. Если вы все же хотите факторизовать примитивы, возможно, модель может быть хорошим местом или сторонним контекстом, но, конечно, не Контроллером.

Вы должны обязательно указать действие внутри маршрутизатора и соответственно перейти к нему.

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

UPDATE

Первый пример (рядом с вашим образцом)

На выделенном маршруте:

saveAndReturnSomewhere: function (router, event) {
  var store = router.get('store'),
      boardName = event.context; // you pass the (data|data container) here. In the view: {{action saveAndReturnSomewhere context="..."}}
  store.createRecord(App.Board, {
    title: boardName
  });
  store.commit();
  router.transitionTo('somewhere');
}

Рефакторированный пример

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

  • show: отображает существующий элемент,
  • edit: предлагает ввести поля элемента

В прилагаемый маршрут, следующие обработчики событий:

  • createItem: создать новый маршрут записи и перехода к edit, например
  • editItem: transitionTo edit route

В маршрут edit, следующие обработчики событий:

  • saveItem: который будет передавать маршрут хранения и перехода в show, например

Ответ 2

Используйте transitionToRoute ('route') для перенаправления внутри действия контроллера Ember:

App.AddBoardController = Ember.Controller.extend({
    create: function(){ 
        ...
        //TODO: Redirect to route
        this.transitionToRoute('route_name');
    }
...

Ответ 3

EDIT: Продолжайте читать, Майк отвечает на некоторые проблемы с этим подходом.

Вы можете просто вызвать transitionTo непосредственно на маршрутизаторе. Если вы используете значения по умолчанию, это выглядит как App.router.transitionTo('route', context).