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 )
                }
            } )
        },