2017-03-06 8 views
0

私はionic2プロジェクトでprotobuf.jsを使用しています。私が最初で、静的なJavaScriptのファイルに変換し、有効な.protoファイルを持っている:

pbjs -t static databaseapi.proto > databaseapi.js 
Becasue ionic2はtypescriptですを使用しています

は、私が実行してd.tsファイルを追加 :

pbts databaseapi.js > databaseapi.d.ts 

私のアプリケーションtranspilesをそして、実行されますが、私は、ランタイムエラーで終わる:

ランタイムエラー$のいるProtobufは、私はそれがあることを知っている

が定義されていません。コンパイルされたプロトコルバッファファイルが変数$ protobufを参照する原因になりますが、この変数がどこに定義されているのかはよくわかりません。また、tsファイルではなくjsファイルで参照する必要があるため、欠落したファイルをどのようにインクルードするかわかりません。

+0

これは生成コードの問題です: -/ProtoBufのドキュメントを参照する必要がありますように推測します。私の知らない推測では、protobufライブラリも含める必要があるということです。 –

+0

ええ、私は、 'protobufjs";から 'import * as $ protobufを試しました;'ページコントローラーとapp.module.tsの両方で無駄にしました。 – mp035

+0

これを試しましたか:https://github.com/dcodeIO/protobuf.js#usage-with-typescript何らかの理由でブラウザのインポートが異なります。 –

答えて

0

ありがとうDCODEを、私は少し違っそれをやってしまいました。これを読んでいる他の人には、解決策はイオン特有のものです。もっと一般的な解決法については、dcodeの答えをご覧ください。

私は何をやってしまった、次のようにコルドバのindex.htmlをにjsのコンパイル済みのファイルへの参照を追加しました:

<script src="lib/protobuf.js"></script> 
<script>$protobuf = protobuf;</script> 
<script src="js/databaseapi.js"></script> 
<script> $database = $root.com.database.api.v1; </script> 

databaseapi.jsはコンパイルいるProtobufファイルの名前です。

+0

そう、グローバルな状況でこれを行うことができます。ただし、これは追加の$ Reader、$ Writer、$ util、および$ root変数を使用して多少は汚染され、厳密なモードがオンになっているかどうかは保証されません。 – dcode

+0

可能性のある問題を回避する「クロージャ」ラッパーを追加しました。使用法: 'pbjs -t静的モジュール-wクロージャー-r databaseapi databaseapi.proto'。これは、 'protobuf'がグローバルであるところのJSファイルを生成し、' protobuf.roots.databaseapi'にすべてを追加します(これは-rスイッチのためです)。汚染されず、厳格なモードを保証します。 – dcode

1

-t staticは、生のコードを作成するだけですが、モジュールとしてラップしません(したがって、$protobufの依存関係は定義しません)。

また、モジュールとしてラップするには、-t static-moduleを使用し、で目的の形式を選択します。 defaultは、AMD、CommonJSおよびグローバル変数で動作するユニバーサルラッパーを使用します。すべてのコマンドラインオプションについては

、以下を参照してくださいhttps://github.com/dcodeIO/protobuf.js#command-line

関連する問題