我有两个部件,一个坐在另一个上。我需要将一个事件从子组件发送到主路由(两个组件在同一路由中使用)
请告诉我,有什么标准的方法吗?
发布于 2017-02-17 02:50:35
简单地说,你可以使用余烬-路线-行动-帮手插件。
<button {{action (route-action 'onButtonClick')}}>ClickToCallRouteAction</button>
行动沟通有三种方式,
1.旧式经典函数样式.,将函数名从上到下传递为字符串。在所有的地方,我们都需要定义相同的功能并提供。使用sendAction
来实现气泡。send
方法从控制器到路由层次的冒泡。
这是不鼓励的。样本经典风格动作旋转
2.闭包操作使用action
助手传递函数,而不是只使用字符串。这样你就不用到处定义它了。关闭动作的样例旋转样式
3. 路线-行动-辅助副词您可以直接从任何地方调用路由操作,只需使用route-action
助手包装函数即可。
经典风格与闭包风格的比较及为什么闭包更可取?
onclick=(action (mut title) value="titlevalue")
(action 'save' target=session)
将查看session
对象上的actions
哈希,而不是当前上下文。有关这方面的一些有希望的文章,
发布于 2019-09-17 18:05:26
从Ember3.14,辛烷值开始,我们可以用一种现代、明确、简洁和清晰的方式解决这个问题--在这个短暂的间歇之后,我们将讨论这个问题:
我需要从子组件向主路由发送一个事件。
虽然这是可能的,但强烈建议反对,因为路由不应该有操作,并且应该是无状态的。也就是说,我们可以通过以下几种方式解决行动通过深层组件的问题:
对于第一个组件,数据向下,动作向上,您可以将参数向下传递给您想要的组件层。
// app/controllers/application.js:
@action
dance(){
console.log('┏(-_-)┓┏(-_-)┛┗(-_- )┓')
}
// app/templates/application.hbs
<Foo @dance={{this.dance}} />
// app/components/foo.hbs
<Bar @dance={{@dance}} />
// app/components/bar.hbs
<button {{on 'click' @dance}}>Dance!</button>
这可能是个滑坡。虽然只有两个组件来下载数据,并执行操作(在本例中单击之后),但这似乎不太费劲,但许多up可能是深入的10+组件,并将使用名为支柱钻井的反模式。
为了减轻支柱钻探的影响,我们在工具箱中有另一种方法可供选择。服务!
// app/services/my-service.js
@action
dance(){
console.log('┏(-_-)┓┏(-_-)┛┗(-_- )┓')
}
// app/components/bar.js
import Component from '@glimmer/component';
import { inject as service } from '@ember/service';
export default class Bar extends Component {
@service myService;
}
// app/components/bar.hbs
<button {{on 'click' this.myService.dance}}>Dance!</button>
深度嵌套的组件可以直接访问操作,而不需要通过几个层传递--这将带来更易于维护和更清晰的代码。
资源
https://stackoverflow.com/questions/42295604
复制