繁体   English   中英

从组件触发路由动作

[英]Trigger route action from component

我有一个组件,我想在其上触发路由级别操作,以便我可以转换到不同的路由。

App = Ember.Application.create();

App.Router.map(function() {
});

App.IndexRoute = Ember.Route.extend({
  actions: {
    complete: function() {
      // This never happens :(
      console.log('Triggered complete!');
    }
  }
});

App.MyAreaComponent = Ember.Component.extend({
  actions: {
    clickMyButton: function() {
      console.log('Triggering complete action.');
      // Attempting to trigger App.IndexRoute.actions.complete here
      this.sendAction('complete');
    }
  }
});

我想要完成的是当 MyAreaComponent 的“clickMyButton”操作被触发时,它将触发 IndexRoute 的“完成”操作。

我已经设置了一个 jsbin 来演示我的问题:

http://emberjs.jsbin.com/wivuyike/1/edit

根据EmberJs 关于动作冒泡的文档

如果 controller 没有在其操作 object 中实现与操作同名的方法,操作将被发送到路由器,当前活动的叶子路由将有机会处理操作。

因此,考虑到这一点,我希望组件会说“让我们检查我的 controller,看看它是否有一个名为‘完成’的动作。没有?好的,让我们检查我的路线 (IndexRoute),看看它是否有一个名为‘完成’的动作'. 是吗?好的,触发它!

我唯一能想到的是,由于组件的设置方式,没有将IndexRoute设置为组件的路由,所以冒泡的动作只是停在了controller。

我不确定从这里到哪里去 go。 我是否需要做一些特别的事情来让我的组件知道我的 IndexRoute?

这是您更新的样本 - http://emberjs.jsbin.com/wivuyike/3/edit

因此,从组件中你需要让自己冒出来,这可以通过以下方式完成

this.sendAction('clickMyButton');

然后在使用组件时,将需要触发的路径操作分配给组件操作,如下所示

{{my-area clickMyButton='complete'}}

在路线旁边的模板中:

{{component-name refresh=(route-action "refresh")}}

然后在组件中你可以调用它:

this.get('refresh')();

通过在组件中创建另一个动作,可以从组件模板中调用一个动作。

所以今天它节省了我的时间。

如果您在操作中没有执行任何其他操作,除了向路径发送操作之外,您可以尝试直接从模板执行此操作:

<button {{action "complete" target="route"}}>Complete</button>

(未经测试的代码,请确保先测试!)

...否则看起来你应该这样做:

this.sendAction('action', 'complete');

代替:

this.sendAction('complete');

所以看起来你只是错过了问题中发布的代码中的第一个参数。 参考

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM