33

我有一个多步骤流程,用户可以按顺序完成或直接跳到一个部分(如果中间的部分已完成)。我认为这个逻辑应该在 Route 对象中。但是,从控制器内部,我如何访问路由实例。例如,能够在控制器中执行以下操作将是理想的:

App.Flow = Em.ObjectController.extend({
  submit: function(){
    // Validation and XHR requests
    // ...

    // Go to the next step
    route.goToNextStep();
  }
}
4

4 回答 4

41

在控制器中,您可以通过 访问路由器this.get('target')。所以this.get('target').send('goToNextStep')应该工作。

像这样:

App.Flow = Em.ObjectController.extend({
  submit: function(){
    // ...
    this.get('target').send('gotoNextStep');
  }
}

App.FlowRoute = Ember.Route.extend({
  events: {
    gotoNextStep: function(){
      // ...
      this.transitionTo(routeName);
    }
  }
}
于 2013-07-03T23:04:47.023 回答
2

您需要获取此类条件的路线,因此控制器只需说,

App.Flow = Em.ObjectController.extend({
  submit: function(){
    var self =this;
    // Validation and XHR requests
    // ...

    // Go to the next step
    self.send('goToNextStep');
  }
}

goToNextStep并在路线的事件哈希中定义您的事件

于 2013-07-04T04:53:46.290 回答
0

'this' 是指向路由器的内容,但您不应该向该原型添加任何方法。相反,制作某种触​​发过渡到下一步的事件。

于 2013-07-03T22:57:36.137 回答
0

此外target,现在在 Ember 中执行此操作的另一种方法是使用getOwner.

例如,要将操作发送到您的应用程序路由:

import Component from '@ember/component';
import { action } from '@ember/object'; // https://github.com/pzuraq/ember-decorators-polyfill
import { getOwner } from '@ember/application';

export default class MyTopLevelComponent extends Component {
    @action
    closeModal() {
      getOwner(this).lookup('route:application').send('closeModal');
    }
});
于 2019-04-24T04:22:19.883 回答