【问题标题】:Ember call action in application route with return value带有返回值的应用程序路由中的 Ember 调用操作
【发布时间】:2018-05-14 14:15:28
【问题描述】:

在 Ember 中,您可以像调用普通函数一样调用当前上下文中的操作,使用 this.actions.actionName()。这意味着该操作可以返回一个值。

在我的登录路由中,我试图以这种方式从应用程序路由调用一个动作。但是this.actions 仅包含我的登录路径中的操作。

登录路径

actions: {
  test: function() {
    console.log(this.actions.sameRouteAction()); //5
    console.log(this.actions.applicationRouteAction()); // this.actions.applicationRouteAction() is not a function.
  },
  
  sameRouteAction: function() {
    return 5;
  }
}

申请途径

actions: {
  applicationRouteAction: function() {
    return 7;
  }
}

this.actions.applicationRouteAction() 必须变成什么才能使它起作用?

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    从 Ember 3.1.0 开始,您无法像在当前路由/类的上下文中那样直接在父路由上调用操作作为普通函数。您可以使用send 函数向上发送操作:

    actions: {
      test: function() {
        this.send('applicationRouteAction');
      },
    }
    

    但是您将无法通过这种方式获取applicationRouteAction 函数的返回值。

    将动作结果从父路由传递到子路由的两个最佳选择是:

    1. 通过transitionTorefresh 更新父路由的模型。这将更新路由树,您的子路由可以通过modelFor 获取其父路由的模型。由于您在示例中使用了 Application 路由,因此这似乎不是您想要使用的方法。

    2. 创建或使用现有的Service 在路由之间进行通信。您可以在两个位置注入服务,从 Application 路由更新其状态,并从子路由读取其状态。

    如果您可以添加有关您希望操作执行的操作的更多详细信息,我可以更新此答案,详细说明哪种模式更有意义以及为什么!

    【讨论】:

    • 谢谢。我的主要目标是让我的代码尽可能 DRY,所以在这种情况下,我认为将操作从应用程序路由移动到 mixin 就可以了。
    • 如果你要走那条路,我会推荐一个实用函数。 Ember mixin 可能不会持续太久,框架正在慢慢转向使用本地类而不是 EmberObject,并且本地类还没有 mixin 的概念。在某些时候肯定会出现原生 mixin 解决方案,但实用程序函数是最安全的选择。
    猜你喜欢
    • 1970-01-01
    • 2013-10-26
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多