2

Seth Ladd の Polymer.dart の例は素晴らしく、非常に役に立ちます。observable_listの例ではDateTime、インスタンスをObservableList timestamps. 拡張はDateTimeしませんが、 my_element.htmlObservableを変更して上のフィールドにアクセスします

{{ts in timestamps}}

Dart VM での実行時に動作します。たとえば、

<li>{{ts}}</li>

<li>{{ts.second}}</li>

DateTime.secondsDart VM 上でフィールドにアクセスします。ただし、dart2js がアプリを JavaScript にコンパイルすると、Polymer 式のフィールドへのアクセスが壊れます。Uncaught Error: RangeError: value 0この場合、例外がスローされます。より一般的NoSuchMethodError : method not found: 'Symbol(...)'には、フィールド名がスローされます (こちらの例を参照) 。

クラスが拡張されている場合、フィールドへのObservableアクセスは@observable、Javascript にコンパイルした後、Polymer 式内で機能します (MyRow この例でクラスを に変更しても、javascript では例外がスローされextends Observableません)。

のような外部クラスに注釈を追加できない場合はどうすればよいDateTimeですか? これはただの dart2js 生成の現在のバグですか? それとも、Polymer.dart の仕様により、観測不可能なクラスからフィールドを読み取ることが禁止されますか? 以前は、dart-protobuf でweb_ui生成されたクラスのフィールドに、javascript にコンパイルした後に正常にアクセスできたので、このユース ケースが Polymer.dart でもサポートされることを期待しています。

4

1 に答える 1

2

一般に、dart2js はコードをツリー シェイクして縮小しようとしますが、コードの一部がポリマー式 (ミラーを内部的に使用して式を解釈する) から使用されていることを認識していません。ここで起こったことは、dart2js が観察不可能なフィールドを削除するか、それらが反映されないように縮小していることです。

これを修正するには、これらのフィールドを保存してミラー経由で使用する必要があることを示すことができます。ポリマーでは、この目的のために @reflectable アノテーションを提供します。(@observable は @reflectable も意味するため、@observable がある場合に機能します)。そのため、その場合に使用できますMyRow

コア ライブラリの型のフィールドは、リフレクト可能になった場合にも機能します。この場合、元のコードを変更してこのアノテーションを追加することはできないため、表現が少し難しくなります。代わりに、@MirrorsUsed アノテーションを使用して、これらのコア タイプのデフォルトの動作をオーバーライドするか、@reflectable ゲッター内または Dart コードで直接記述されたフィルター内に非表示にすることで、ポリマー式内でこれらのフィールドを使用しないようにすることができます。

于 2013-11-22T17:48:39.380 に答える