angular issue closed

Angularのテンプレート評価式にビット演算を使うとTemplate parse errorが発生する

投稿日:2019年9月5日

AngularのテンプレートHTMLでビット演算をすることは禁じられているので代替手段を考えます。

事象

CSSクラスをビット演算で切り替えるテンプレートを書きました。
cond変数は1,2,4をビット値として持つ状態変数です。

<button ion-button clear="true" (click)="clickButton(2)">
    <img id="status1" src="./assets/img/normal.svg" 
        [className]="(cond & 2) ? 'on' : 'off'"/>
</button>

すると実行時、Chromeのコンソールに以下のエラー。

Uncaught Error: Template parse errors:
Parser Error: Missing expected ) at column 18 in [(Cond & 2) ? 'on' : 'off'] in ~

        [ERROR ->][className]="(cond & 2) ? 'on' : 'off'"

文法的におかしいところは無く、cond変数の値がが2,3,7の場合はtrueになってCSSクラス「on」がimgに適用されるはずなのに何故・・・。

原因

Angularは古くからテンプレート評価式の中でビット演算をすることが許されていない為。

No Bitwise, Comma, And Void Operators: You cannot use Bitwise, or void operators in an AngularJS expression.

https://docs.angularjs.org/guide/expression

対処

コントローラにでもビット演算をするメソッドを定義しておき、それを呼ぶことで回避。

コントローラで代替メソッドを定義。

    public checkCond(cond, flg) {
        return cond & flg;
    }

HTMLではビット演算せずに上記メソッドを呼び出す。

<button ion-button clear="true" (click)="clickButton(2)">
    <img id="status1" src="./assets/img/normal.svg" 
        [className]="checkCond(cond, 2) ? 'on' : 'off'"/>
</button>

ただTypescript上でビット演算が出来るようになっても今度はtslintに警告を出されてしまいます。

ERROR: src/pages/****.ts:1065:18 - Forbidden bitwise operation

不便なのでルール的にビット演算を使ってよい、とtslint.jsonルールを変更して更に回避。

{
    "rules": {
    
        (snip)
    
        "no-bitwise": false,   <-- trueから変更

すんなりビット演算させてくれないです。

-angular, issue closed
-

執筆者:

関連記事

Angular8のDefferential Loadで作られたPolyfill抜きJSがブラウザに読み込まれるまでを観察してみる

Angular単体では約30%の削減でした。 2019/05にリリースされたAngular8では、ビルド結果として生成されるバンドルファイルがES6(ES2015)対応しているモダンブラウザ用、とそう …

Typescript3.0以下の環境で発生する「Cannot find name ‘unknown’」に対処する

目次1 事象2 原因3 対処4 まとめ 事象 Typescript2.3.4を使っている息の長いWebシステムでnpm installをし直し、tscビルドし直したらトランスパイルエラーが発生。「un …

java.security.InvalidKeyException: IOException : DerInputStream.getLength(): lengthTag=111, too big.

目次1 事象2 原因3 対処4 得た教訓 事象 OpenSSLで作成した秘密鍵をJava(Eclipse + Maven環境)で読み込み、公開鍵で暗号化されたデータを復号しようとした際に例外が発生しま …

ERROR: Several keys given – pgcrypto does not handle keyring、またはERROR: Corrupt ascii-armor

gpgキーストアに同じUIDで複数の鍵ペアを登録してしまうと、ファイルにexportした際に1ファイルに複数の鍵情報が入ってしまい、1ファイル1鍵を期待しているpgcryptoに怒られます。 目次1 …

compodocでAngularプロジェクトのビジュアルなドキュメントを自動生成する

Java、C、Pythonのドキュメントを自動生成する際にDoxygenを使えばクラス図や呼び出し図、呼び出され図を作れて便利です。 しかしDoxygenはTypescriptには対応しておらず、.t …

 

shingo.nakanishi
 

東京在勤、1977年生まれ、IT職歴2n年、生涯現役技術者を目指しています。健康第一。