2

違いは何ですか:

context["recentlyUsedStations"] = ["Goetheplatz", "Marienplatz"];

context["recentlyUsedStations"] = new JsObject.jsify(["Goetheplatz", "Marienplatz"]);

これをクロム拡張の背景ページで使用していますが、どちらの場合もポップアップ ページで値を取得できます。リストを変更しようとすると、最初のケースでは整数の配列 (値 0) が生成されます。2 番目のケースは問題なく動作します。

4

1 に答える 1

3

最初のバージョンでは、 Dart オブジェクトへの参照を含むrecentlyUsedStationsjs オブジェクトで設定された値で名前が付けられた js 変数を定義します。Js 側から見ると、この変数はほとんど使用できず、Dart オブジェクトの参照を保持するためにのみ使用する必要があります。このように、Dart オブジェクトは を呼び出して取得できます。DartObject["Goetheplatz", "Marienplatz"]context["recentlyUsedStations"]

なし new js.JsObject.jsify(...):

final a = ['b', 'c'];
js.context['a'] = a;

// unusable wrapper on Js side
// display : [object DartObject]
js.context['console'].callMethod('log', [js.context['a']]);

// the reference is kept
// display : true
print(identical(a, js.context['a']));

2 番目のバージョンは、同等の js array にrecentlyUsedStations変換することによって作成された js オブジェクトで設定された値で名前が付けられた js 変数を定義します。このように、データは Js 側で使用できますが、元の Dart オブジェクトの参照は忘れられます。したがって、dart List に要素を追加しても、Js 側の配列には影響しません。["Goetheplatz", "Marienplatz"]["Goetheplatz", "Marienplatz"]

new js.JsObject.jsify(...):

final a = ['b', 'c'];
js.context['a'] = new js.JsObject.jsify(a);

// converted to an array on Js side
// display : [b,c]
js.context['console'].callMethod('log', [js.context['a']]);

// the reference has been forgotten
// display : false
print(identical(a, js.context['a']));

// adding an element on the original List has no effect on Js value
a.add('d');
js.context['console'].callMethod('log', [js.context['a']]); // b,c
于 2014-01-17T20:55:34.863 に答える