2016-05-08 2 views
0

私は、開始と停止の2つのアクションを持つ非常に単純なコンポーネントを持っています。これらはボタンをクリックすると起動します。最初のアクションはルートまでバブリングされ、期待どおりに機能しますが、2番目のアクションはコンポーネントで発生しますが、ルートには決して出ません。Ember.js(v2.4.5)のコンポーネントが第2のアクションを追い越していない

私はEmberを使い始めたばかりですが、コンポーネントは複数のアクションを実行することができますか?

コンソールにエラーはありません。ボタンは何もせず、ルートからのコンソールログは表示されません。

コンポーネントアクション

actions: { 

    start() { 
    console.log('component start called'); 
    this.sendAction('start', this.get('item')); 
    }, 

    stop() { 
    console.log('component stop called'); 
    this.sendAction('stop', this.get('item')); 
    } 
} 

ルートアクション

actions: { 
    start (server) { 
     console.log('route start called'); 
     server.set("settings.amazonTask", 'start'); 
     server.save(); 
    }, 

    stop (server) { 
     console.log('route stop called'); 
     server.set('settings.amazonTask', 'stop'); 
     server.save(); 
    } 
} 

テンプレート

<button type="button" 
     class="btn btn-default btn-sm" {{action "start"}}> 
    Turn on 
</button> 


<button type="button" 
     class="btn btn-default btn-sm" {{action "stop"}}> 
    Turn off 
</button> 

答えて

1

あなたヘクタール

{{my-component start=(action 'start') stop=(action 'stop')}} 

そして、あなたはsendActionで、その後呼び出すことができます。あなたのコンポーネントまでのアクションを与えることをVEの。

新しい構文を使用して、attrsオブジェクトのアクションに直接アクセスすることを強くお勧めします。これは非常に明確であると起こっていただきました!明らかに:

this.attrs['start'](this.get('item')) 

実はactionヘルパーはちょうどactionsオブジェクトからアクションを取得し、現在のコンテキストにそれを境界と。その結果をコンポーネントに渡してから、actionヘルパーを実行したコンテキストで呼び出すことができます。

すでに作成されたアクションでactionヘルパーを呼び出すと、アクションがリバウンドされずにそのまま渡されることに注意してください。

+0

これは当然のことながら、私は開始のためのアクションを設定しましたが、停止のアクションは忘れました。私はあなたのコメントの残りの部分について少し混乱していますが、私が実際にやっていることをお勧めします。ドキュメント/ガイドへのリンクか詳細な例を提供できますか? –

+1

[オリジナルのブログ投稿](http://emberjs.com/blog/2015/06/12/ember-1-13-0-released.html#toc_closure-actions)をチェックアウトしている可能性があります。 'sendAction'を使用しないことをお勧めします。なぜなら、その混乱の魔法で、通常はthis.attrs ['action']()' whisと同じですが、明らかに結果を与える明確な関数呼び出しです。 – Lux

関連する問題