2016-09-18 3 views
2

私はクロージャーアクションを理解しようとしていますが、コードをテストしています。私のindex.hbsテンプレートでは、私はそうのようなコンポーネントをレンダリングしていますember - closureアクションでエラーが発生し、コンポーネントでアクションが提供されない限りページがレンダリングされません。

{{test-component test=(action 'foo')}} 

を私のindex.jsコントローラでは、私はアクションfoo定義している:私はアクションをトリガーするボタンがあり

foo: function() { 
    console.log('foo executed'); 
    }, 

そして、私のtest-component.hbsコンポーネント内をように:

<button {{action (action 'test')}}>Test Button</button>. 

しかし、ページがクラッシュし、コンソールで次のエラーが表示されます。012私はページが私はあなたが閉鎖アクションを使用した印象の下にあったがtest-component.hbstestアクションを挿入することによって、再びレンダリングすることができます

、あなたのコンポーネントに何を配置する必要がありませんでしたか?私はここで間違って何をしていますか?

答えて

3

クロージャアクションについて考える簡単な方法は、関数参照を渡すことです。あなたは

{{test-component test=(action 'foo')}} 

あなたは基本的に

は、グラブは、現在のコンテキストからのアクション'foo'とは、財産test

として渡して言っていると言うあなたの与えられたコードで

、具体的な例の擬似コードは次のようになります。

コントローラでアクション fooで同じ機能を test-componentポイント内のプロパティ testを意味
{{test-component test=IndexController.actions.foo}} 

したがって、あなただけそれを直接使用します。

// test is an action passed into test-component 
<button {{action test}}>Test Button</button>. 

は簡単なEmberTwiddle exampleです。あなたはtest-component、そのコンポーネント自体やコンポーネントがアクションtestを持たないで、現在のコンテキスト内のアクションtest、探し内{{action (action 'test')}}を言う

は、それが指すように起こるtestと呼ばれる性質を持っていますその外側の文脈からのアクション、indexコントローラ。

+0

ありがとうございました。私のコンポーネントで使用していた構文は、別の状況で使用されるものですか? – PCR

+0

はい。私は私の答えの最後の段落でそれを述べました。その構文は、現在のコンテキストからアクションを呼び出すことであり、コンポーネントそのものです。これは 'test-component'に' foo'を渡したときに使用するのと同じシンタックスで、 'index'コントローラでアクションを呼び出すために使用します。 '{{action(action 'actionName')}}'と言っても余計ですが、必要なのは '{{action 'actionName'}}'だけです。 「アクション」ヘルパー、すなわち'(action 'actionName')'はアクションを渡すために使われ、 '{{action 'actionName'}}'は現在のコンテキストでアクションを呼び出すために使われます – nem035

関連する問題