1

我有一个关于 Ember 路由和控制器的问题。我刚刚写了一个小应用程序来熟悉新的路由器。因此,我构建了一个按钮,通过单击它可以转换到另一个状态。

App.PostsView = Em.View.extend({
  click: function() {
    var router;
    this.get('controller').transitionTo('about');
  }
});

我现在的问题是:get方法返回什么?. 显然是一个实例,PostController但一方面控制器没有transitionTo()方法,另一方面没有任何意义。

4

3 回答 3

3

this.get('foo')返回 Ember 对象的属性。由于视图可以具有“控制器”属性,this.get('controller')因此返回绑定到视图控制器属性的控制器(默认情况下为 postsController)。

this.get('controller').transitionTo()之所以有效,是因为正如 sly7_7 所提到的,transitionTo()它也在控制器上定义并委托给路由器。请注意,它可能会被弃用,应该使用

this.get('controller').transitionToRoute('about');

反而。

于 2013-01-23T17:51:48.697 回答
2

您不应该在视图级别执行此操作,这是路由器的设计目的,因此与其在视图中捕获单击事件,不如在按钮上实现一个动作并让路由器处理它。我建议您从一开始就学习最佳实践,您的应用程序可能会发展,需要更复杂的概念,例如处理事务提交/回滚,创建/更新记录。所以这是我给你的建议

在你看来

<button type="button" {{action onSaveClick}} />Save</button>

在您的路由器中

App.FooRoute = App.Route.extend({
    events: {
        onSaveClick: function() {
            this.transitionTo('bar');
        }
    }
})

如果由于任何其他原因,比如样式或动画,您发现自己被迫在视图中捕获点击事件,那么我建议您捕获事件,执行您的样式,最后向控制器发送一个事件。然后可以在路由器中以相同的方式处理该事件

App.FooView = Ember.View.extend({
 click: function() {
   // Do some styling
   this.get('controller').send('onSaveClick')
 }
})

最后谈到最佳实践,尝试学习在使用 ember 时将您的应用程序视为一系列相互交互的状态。你会发现自己必须正确实施这个概念。看看这个

于 2013-01-23T18:26:30.330 回答
1

控制器有一个 transitionTo: https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/ext/controller.js#L36,它基本上委托给它的目标(这是路由器)

于 2013-01-23T16:58:24.573 回答