2014-01-17 4 views
2

В чем разница между:Проблем с Dart/JS Interop в расширении хромированной

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

и

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

Я использую это на фоне странице расширения хрома и я в состоянии получить значения на всплывающей странице в обоих случаях. Если я попытаюсь изменить список, тогда первый случай создает массив целых чисел (значение 0). Второй случай работает нормально.

ответ

3

Первая версия определяет переменную js с именем recentlyUsedStations с ее значением, заданным с помощью объекта js DartObject, содержащего ссылку на объект Dart ["Goetheplatz", "Marienplatz"]. Со стороны Js эта переменная почти непригодна и должна использоваться только для сохранения ссылки на объект Dart. Таким образом, объект Дарт можно получить, вызвав 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'])); 

Вторая версия определяет переменную JS с именем recentlyUsedStations с его значением, установленным с объектом JS, которая была создана путем преобразования ["Goetheplatz", "Marienplatz"] в эквивалентный Js массив ["Goetheplatz", "Marienplatz"]. Таким образом, данные могут использоваться на стороне Js, но он забывает ссылку на исходный объект Dart. Поэтому добавление элемента в список дротиков не влияет на массив на стороне Js.

С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 
+0

Alexandre, вы уверены, что добавление элемента к списку на стороне вытачки не отражается на стороне Js? В консоли инструментов разработчика я могу наблюдать за изменениями в объекте js. –

+0

Если вы используете 'jsify', я уверен, что добавление элемента в объект Dart не влияет на объект Js. –

+0

Используя ваш пример, последняя строка выводит вывод * null * –