我有一个多步骤流程,用户可以顺序完成或直接跳转到某个部分(如果两者之间的部分已完成)。我认为这个逻辑应该在Route对象中。但是,从控制器内部,我如何访问路由实例。例如,能够在控制器中执行类似的操作是理想的:
App.Flow = Em.ObjectController.extend({
submit: function(){
// Validation and XHR requests
// ...
// Go to the next step
route.goToNextStep();
}
}
答案 0 :(得分:39)
在控制器内,您可以通过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);
}
}
}
答案 1 :(得分:2)
你需要获得这些条件的路线, 所以从控制器说,
App.Flow = Em.ObjectController.extend({
submit: function(){
var self =this;
// Validation and XHR requests
// ...
// Go to the next step
self.send('goToNextStep');
}
}
并在路线的事件哈希中定义您的goToNextStep
事件
答案 2 :(得分:0)
'this'是指向路由器的内容,但您不应该向该原型添加任何方法。相反,制作某种触发过渡到下一步的事件。
答案 3 :(得分: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');
}
});