3

假设我有一条带有类似事件的路线

App.FooRoute = Ember.Route.extend({
  events: {
    anAction: function(){
    }
  }
})

如何从另一个路由/控制器的角度触发它?

<a {{action anAction target='???'}}> a link </a>
4

2 回答 2

2

假设您有这样的路线:

App.Router
  |
  + FooRoute
  |
  + BarRoute

FooRoute将动作从 发送到意味着什么BarRoute?用户已前往/foo,因此FooModelFooControllerFooView已初始化,但尚未初始化Bar*。行动会做什么?

案例 1:Action 操作 Bar

在这种情况下,有一个BarModelaround 是FooRoute. 解决这个问题的最类似于 Ember 的方法是使用嵌套路由:

App.Router.map(function() {
  this.resource('bar', function() {
    this.route('foo');
  }
});

用户去/bars/123/foo并点击链接,触发anAction. Ember 会自动将该动作冒泡到路由层次结构中,因此您可以简单地定义anActionon BarRoute

案例2:行动不需要酒吧

在这种情况下,BarModel不需要 a。anAction做一些不是真正Foo相关的事情,但也不是Bar相关的。我们可以使用相同的冒泡技巧,但不是定义anActionon BarRoute,而是在主路由器上定义它。

案例 3:动作需要一个全局对象

假设该操作需要“当前用户”。这种情况很像#2,因为您不需要嵌套路由。但是,它确实需要您拥有一个可全局寻址的控制器,例如App.currentUserController. 您可以直接将其指定target{{action}}.

案例 4:你真的想定位 BarController

如果上述选项似乎都不正确,您可以使用controllerFor在 上设置barController属性fooController

App.FooRoute = Ember.Route.extend({
  setupController: function(controller) {
    var barController = this.controllerFor('bar');
    controller.set('barController', barController);
  }
});

然后你可以做{{action anAction target=barController}}

概括

Ember 将自动尝试对控制器执行该操作,然后冒泡路由层次结构。如果模型依赖于其他模型,您可能需要嵌套路由或全局控制器来确保连接您的先决条件。

于 2013-02-17T18:07:02.203 回答
0

正如Ember Docs中所解释的,您可以使用名为 Ember.ViewTargetActionSupport 的内置 mixin 将操作发送到应用程序中的不同控制器或视图或路由。

处理您的问题的简单方法如下:

  1. 模板中调用的事件在当前视图中处理
  2. 这个视图混合了 Em.ViewTargetActionSupport
  3. 这个事件,写在你的视图中,调用 this.triggerAction 函数,指定你试图在不同的视图/控制器/路由(目标)中调用的操作

当前模板:

<a {{action 'actionInView' target='view'}}>Click me</a>

风景:

App.CurrentView = Em.View.extend(Em.ViewTargetActionSupport, { // Note the mixin
  actions: { // Actions hash
    actionInView: {
      this.triggerAction({ // Without a target this will bubble through the routes
        action: 'theActionToCall', // Name of the action you *actually* want to call
        target: App.TargetController, // Or whatever the name of your target is
      });
    },
  },
});

目标控制器:

App.TargetController = Em.ObjectController.extend({
  actions: {
    theActionToCall: {
      // This is where you do the action stuff that you *actually* are trying to do
    },
  },
});

本质上,名为 actionInView 的操作除了调用您真正想要但无法访问的操作之外什么都不做,因为它位于应用程序的不同部分。如果您没有指定目标,那么您可以将操作放在父路由或应用程序路由上,它将被调用。

于 2013-12-05T17:01:10.133 回答