行动在Ember冒泡

时间:2015-10-06 16:50:31

标签: ember.js

我对Ember相对较新,请原谅我这个问题的答案是否明显。我最近开始了一份新工作,我认为他们采取行动鼓泡的做法是......好奇。

这是一个包含大量嵌套组件的大型应用程序。为了将操作鼓泡到控制器,他们一直在使用这类东西:

actionName (parameter) {
    this.attrs.actionName(parameter);
},

然后,这会将一个级别冒泡到下一个组件,在那里他们将再次调用相同的操作 。这将以这种方式继续,直到它到达定义了动作的控制器。

我不是因为各种原因而对此不喜欢,但主要是因为它使任何新动作都成为一件苦差事。

我的问题是两个人:

1)对于深度嵌套的组件,是否有更好的解决方案?

2)之前我见过sendAction,但在实践中没有使用过它。 this.attrs.actionName(parameter);之间有什么区别?

谢谢!

2 个答案:

答案 0 :(得分:3)

  

对于深度嵌套的组件,是否有更好的解决方案?

简短的回答是否定的。 Ember组件强制您明确地冒泡操作。消费者还必须明确地"订阅"接受它的行动。做出这些设计决策,使代码尽可能明确,以避免意外错误。 (想象一下,如果事件自动冒泡并且某个组件添加了一个新事件。这些事件会自动冒泡,无法捕获,然后导致错误。)

  

之前我见过sendAction,但在实践中没有使用过它。 this.attrs.actionName(参数);?

之间的区别是什么?

for %%a in ("%src%\*.*") do echo %%~na>>%ftp_file% :: "tokens=4 delims=MT52-" FOR /f "tokens=*" %%A in (%ftp_file%) do ( set filename=%%A if !filename:~-1!==l ( set mm=!filename:~-10,2! echo !mm! echo ctrl files: !filename! if !mm! GEQ 01 if !mm! LEQ 03 ( copy %src%\%filename% %dest%\Q1-%year% ) if !mm! GEQ 04 if !mm! LEQ 06 ( copy %src%\%filename% %dest%\Q2-year% ) if !mm! GEQ 07 if !mm! LEQ 09 ( copy %src%\%filename% %dest%\Q3-%year% ) if !mm! GEQ 10 if !mm! LEQ 12 ( copy %src%\%filename% %dest%\Q4-%year% ) ) else ( echo no match found ) ) 是旧的做事方式(2.0之前)。在Ember 2.0中,操作放在$(document).ready( function(){ $("input[type='text'][value*='?']").val("0.00");});对象中。这种方法有一些好处,但最大的一个是可读性。您应该更喜欢新方法,特别是因为新方法允许操作将值返回给调用者(sendAction不允许的话)。

让一个长篇故事变得更短:看起来非常冗长,但它只是Ember做事的方式。通常情况下,它比替代品好得多。

答案 1 :(得分:2)

这是我最近的经历(和头痛);像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>
    

不触及.js文件。

如果您正在使用路线,则必须执行额外步骤以确保您的控制器具有要呼叫的操作:

    //example/route.js

    setupController( controller, model ) {

        Ember.set( controller, 'actions', {

            outerClick: function( value ) {

                console.log( 'Action received!', value )
            }
        } )
    },