我对Ember相对较新,请原谅我这个问题的答案是否明显。我最近开始了一份新工作,我认为他们采取行动鼓泡的做法是......好奇。
这是一个包含大量嵌套组件的大型应用程序。为了将操作鼓泡到控制器,他们一直在使用这类东西:
actionName (parameter) {
this.attrs.actionName(parameter);
},
然后,这会将一个级别冒泡到下一个组件,在那里他们将再次调用相同的操作 。这将以这种方式继续,直到它到达定义了动作的控制器。
我不是因为各种原因而对此不喜欢,但主要是因为它使任何新动作都成为一件苦差事。
我的问题是两个人:
1)对于深度嵌套的组件,是否有更好的解决方案?
2)之前我见过sendAction
,但在实践中没有使用过它。 this.attrs.actionName(parameter);
之间有什么区别?
谢谢!
答案 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 )
}
} )
},