2017-09-21 20 views
0

のない文が真である場合に真を返します。copmonent-level boolean変数とonClickイベントを持つ角度成分があります。 htmlファイルは次のようになります。ブール値をfalseに設定します。 ==

<div class="divClass" (click)="onClick($event)"></div> 

TSファイルからreleventコードは以下の通りである:

export class myComponent implements OnInit { 

    guardFirst : boolean; 
    guardSecond : Boolean; 

    constructor(...) { 
    this.guardFirst = false; 
    this.guardSecond = false; 
    } 

    onClick(ev : MouseEvent) { 

    if (this.guardFirst) { 
     if (this.guardSecond) { 
     console.log("first guard: " + this.guardFirst + "; second guard: " + this.guardSecond); 
     // the logic takes place here 
     } 
     this.guardSecond = true; 
    } 
    this.guardFirst = true; 
    } 

} 

それは独自のものですので、アイブ氏は明らかに実際のコードを変更しましたが、構造は同じです。あなたはロジックとコンソールのログがdivの3回目のクリックまで発生しないことを期待していますが、最初に発生します。コンソールは両方の変数に対してfalseを記録しますが、何らかの理由で2つのif文を渡して、他の言語の仕組みに基づいてfalseを返すと予想します。値との流れを確認するためのデバッグおよびコンソールログをたくさんした後、私は最終的にこのようなコードを変更することが考えた:

onClick(ev : MouseEvent) { 

    if (this.guardFirst == true) { 
    if (this.guardSecond == true) { 
     console.log("first guard: " + this.guardFirst + "; second guard: " + this.guardSecond); 
     // the logic takes place here 
    } 
    this.guardSecond = true; 
    } 
    this.guardFirst = true; 
} 

これは、彼らがnullでないときはいつでも値の等価計算書のないブール値がtrueを返していることを私に伝えますまたは未定義。 falseまたはtrueの場合、割り当てられた値がある限り、trueを返します。私のコードはプリミティブとオブジェクトの両方としてブーリアンを持っていたので、これはこの動作の理由ではありません。私はjsfiddleでAngmarkなしのTypescriptで同様のものをテストしようとしましたが、期待通りの方法で動作しました(値がfalseの場合は、==が不足していてもfalseを返します)。

誰もこの現象を私に説明できますか?それはどこから来たのですか?それは角度のあるものでなければならないようです - それは本当ですか?これは常にAngularでこのように動作するのですか、それとも私のプロジェクトで何か問題がありますか?これは意図された動作ですか?その場合、開発者はなぜその決定を下したのですか?そうでない場合、なぜそれが起こっているのですか?

ありがとうございます。

編集:自己/このタイプミスを修正しました。質問を閉じるように投票した人は、コメントを残して、その質問をなぜ閉じなければならないと思うのか、またSOガイドラインの理解に応じてどのように変更できるのかを説明してください。

+2

が、それは 'this.guardFirst'ではないでしょうか? – oreofeolurin

+0

あなたは自己を定義する場所を表示できますか? – bgraham

+0

あなたは正しいです、それはthis.guardFirstです。私はstackoverflow上にコードを転記していたときに間違いを犯しました。私はSwiftの別のプロジェクトに取り組んでいて、混乱してしまった –

答えて

0

@oreofeolurinが正しいかもしれないと思います。私はこれが角の特定の問題だとは思わないが、javascript/typescriptの問題はこれの代わりにselfを使っている。

ここplunkerは実証することです: https://plnkr.co/edit/SzNQyHvyLVjfN9Fm6GER?p=preview

<div class="divClass" (click)="onClick($event)">Click me</div> 
<div>Clicks: {{clicks}} </div> 


clicks = 0; 

    guardFirst : boolean; 
    guardSecond : Boolean; 

    constructor() { 
    this.guardFirst = false; 
    this.guardSecond = false; 
    } 

    onClick(ev : MouseEvent) { 

    this.clicks++; 

    if (this.guardFirst) { 
     if (this.guardSecond) { 
     alert("hi"); 
     } 
     this.guardSecond = true; 
    } 
    this.guardFirst = true; 
    } 
} 
+0

それは私がコードをSOに移していたときに作ったタイプミスだったので、無視してください。私の実際のコードはこれを使用しています。 –

+0

その場合、私が含まれているプラ​​ンカーをチェックすることはできますか?それはあなたが意図するように動作するように見えます。私のコードとあなたが望んでいるものに違いがありますか?おそらく、実稼働環境のように、コードサンプルの問題を正確に再現していないのでしょうか? – bgraham

関連する問題