からコンポーネントのブール変数の値を切り替える:Ember2.8:私はこのように設定されているゲーム・カード・コンポーネントを持つ親コンポーネント
ゲーム-card.js
import Ember from 'ember';
export default Ember.Component.extend({
classNames: ['flip-container'],
isFlipped: false,
actions: {
doCardClick(param){
this.get('onCardClick')(param);
},
toggleIsFlipped() {
this.toggleProperty('isFlipped');
}
}
});
ゲーム-card.hbsこのコンポーネントは、ゲーム・ハンドラと呼ばれる別のコンポーネントと相互作用
<span {{action 'doCardClick' symbol}}>
<div id="card" {{action 'toggleIsFlipped'}} class = "{{if isFlipped "flipped"}}">
<figure class="front"></figure>
<figure class="back">
<img src={{symbol}} />
</figure>
</div>
</span>
:
ゲーム-handler.js
import Ember from 'ember';
export default Ember.Component.extend({
clickedCard: null,
clickedCards: null,
init() {
this._super(...arguments);
this.set('clickedCard', '');
this.set('clickedCards', []);
},
handleTurn(clickedCards) {
if(clickedCards[0] === clickedCards[1]){
console.log('we have a matching pair!');
this.set('clickedCards', []);
} else {
console.log('no match!');
this.set('clickedCards', []);
}
},
actions: {
handleCardClick(someUrl) {
if(this.clickedCards.length === 1){
//we know the array will have 2 cards to evaluate now.
this.set('clickedCard', someUrl);
this.clickedCards.push(this.clickedCard);
this.set('clickedCard', '');
//we call handleTurn because we have 2 cards
this.handleTurn(this.clickedCards);
} else {
// we just add the first clicked card to the array
this.set('clickedCard', someUrl);
this.clickedCards.push(this.clickedCard);
this.set('clickedCard', '');
}
}
}
});
そしてそうのように実装されている:
ゲーム-handler.hbs
{{#each model.cards as |instance|}}
{{game-card symbol=instance.url onCardClick=(action 'handleCardClick')}}
{{/each}}
ゲーム・ハンドラは2連続クリック枚のカードならば見ての処理ロジックを担当しています同じ画像URLを持っている私が今したいことは、個々のゲームカードのisFlipped変数に、このコンポーネントによって実行されるロジックに応じて変わるように何とか伝えます。
例えば、優勝ペアの場合:
- 我々持って優勝ペア(すなわち、同じ画像URLを持つ2つのゲームカード)
- ゲーム・ハンドラは何とか2枚のカードを分離し、それぞれのプロパティを渡して、 'isFlipped'変数のトグルをトリガします。
Play.js
ルートで
@kumkanillamは、現在どのようにisFlipped変数を切り替えているのかという変更を追加しました。私は現在、コンポーネント内からのみ切り替えていますが、同じ変数をルートのコントローラから切り替えることも可能ですか? –
所有者だけがプロパティの状態を変更する必要があります。現在、isFlippedプロパティの所有者は 'game-card'ですので、コンポーネント内で変更することをお勧めします。コントローラ内で変更したい場合はゲーム全体を移動する必要があります-cardプロパティーをコントローラーに追加します。これは良くない。または、サービスを作成して状態を共有してください。 – kumkanillam
@kumkanillamあなたが言ったことを考慮して、私はゲームハンドラと呼ばれる新しいコンポーネントを作成することにしました。コントローラからゲームハンドラのJSファイルにコードを転送しました。子供の(ゲームカード)の 'isFlipped'プロパティを新しい親コンポーネントから切り替えることができるようになりましたか? –