2015-10-06 68 views
1

我对Ember来说比较新,所以如果这个问题的答案很明显,请原谅我。我最近开始了一项新工作,我认为他们的行动冒泡方式是......好奇。在Ember冒泡的行动

这是一个有很多深度嵌套组件的大型应用程序。泡行动到控制器,他们一直在使用这样的事情很多:

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

这会再泡一个水平提高到下一个组件,在那里他们将调用同样的动作再次。这将以这种方式继续下去,直到它到达定义操作的控制器。

由于各种原因,我不是这个迷,但主要是因为它使得编写任何新的操作变得很麻烦。

我的问题是两个舞伴:

1)对于深嵌套组成部分,有没有更好的解决办法?

2)我以前见过sendAction,但实际上并没有使用它。 this.attrs.actionName(parameter);和有什么不一样?

谢谢!

回答

3

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

简短的回答是否定的。 Ember组件迫使你明确地冒泡操作。消费者还必须明确地“订阅”接收它的动作。做出这些设计决策是为了尽可能明确地避免意外错误。 (试想一下,如果事件自动起泡和组件增加了一个新的事件。这些事件会自动冒泡,去未捕获,然后导致错误。)

我以前看过sendAction,但在实践中还没有使用过。 this.attrs.actionName(parameter);有什么区别?

sendAction是旧的做事方式(前2.0)。相反,在Ember 2.0中,操作被放置在attrs对象中。这种方法有一些好处,但最大的一点是可读性。您应该更喜欢前进的新方法,尤其是因为新方法允许操作将值返回给调用者(sendAction不允许的东西)。

为了让一个真正长的故事稍微短一点:它看起来很冗长,但它只是Ember做事情的方式。往往不是,它比替代品好得多。

1

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