Ember.js 余烬中沸腾的动作
我对余烬来说比较陌生,所以如果这个问题的答案是显而易见的,请原谅我。我最近开始了一份新的工作,我觉得他们的行动方式很奇怪 这是一个大型应用程序,有许多嵌套很深的组件。为了向控制器发送气泡动作,他们经常使用这类东西:Ember.js 余烬中沸腾的动作,ember.js,Ember.js,我对余烬来说比较陌生,所以如果这个问题的答案是显而易见的,请原谅我。我最近开始了一份新的工作,我觉得他们的行动方式很奇怪 这是一个大型应用程序,有许多嵌套很深的组件。为了向控制器发送气泡动作,他们经常使用这类东西: actionName (parameter) { this.attrs.actionName(parameter); }, 然后,这会将一个级别冒泡到下一个组件,在那里他们将再次调用相同的操作。这将以这种方式继续,直到它到达定义动作的控制器 出于各种原因,我不喜欢这个,但主
actionName (parameter) {
this.attrs.actionName(parameter);
},
然后,这会将一个级别冒泡到下一个组件,在那里他们将再次调用相同的操作。这将以这种方式继续,直到它到达定义动作的控制器
出于各种原因,我不喜欢这个,但主要是因为它使写任何新动作成为一件烦人的事
我的问题分为两部分:
1) 对于深度嵌套的组件,有更好的解决方案吗
2) 我以前看过sendAction
,但没有在实践中使用过它。这个.attrs.actionName(参数)之间有什么区别代码>
谢谢大家!
对于深度嵌套的组件,有更好的解决方案吗
简而言之,答案是否定的。余烬组件强制您显式地冒泡动作。消费者还必须明确地“订阅”某个操作才能接收该操作。这些设计决策是为了使代码尽可能明确,以避免意外错误。(想象一下,如果事件自动冒泡,组件添加了一个新事件。这些事件将自动冒泡,取消冒泡,然后导致错误。)
我以前见过sendAction,但没有在实践中使用它。这个.attrs.actionName(参数);,之间有什么区别
sendAction
是旧的做事方式(2.0之前)。在Ember 2.0中,操作被放置在attrs
对象中。这种方法有一些好处,但最大的好处是可读性。您应该更喜欢继续使用新方法,特别是因为新方法允许操作将值返回给调用方(这是sendAction
不允许的)
把一个很长的故事缩短一点:看起来很冗长,但这只是余烬做事的方式。通常情况下,它比其他选择要好得多。这是我最近的经验(和头痛);就像GJK说的
sendAction是旧的做事方式(2.0之前)
所以这是一个禁忌
如果在基本控制器中指定操作,则可以执行以下操作:
- 通过属性将操作传递到组件
//example/template.hbs
{{component "inner-component" ... innerClick=(action "outerClick" 42)}}
- 使用动作
//inner-component/template.hbs
<button {{action this.attrs.innerClick}}> Go! </button>
//example/route.js
setupController( controller, model ) {
Ember.set( controller, 'actions', {
outerClick: function( value ) {
console.log( 'Action received!', value )
}
} )
},