Проблемы с взаимодействием Dart/JS в расширении Chrome

В чем разница между:

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

и

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

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


person Draško Kokić    schedule 17.01.2014    source источник


Ответы (1)


Первая версия определяет переменную js с именем recentlyUsedStations, значение которой устанавливается с объектом js DartObject, содержащим ссылку на объект ["Goetheplatz", "Marienplatz"] Dart. Со стороны Js эта переменная почти непригодна для использования и должна использоваться только для сохранения ссылки на объект Dart. Таким образом, объект 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
person Alexandre Ardhuin    schedule 17.01.2014
comment
Александр, вы уверены, что добавление элемента в список на стороне дротика не отражается на стороне js? В консоли инструментов разработчика я могу наблюдать за изменениями в объекте js. - person Draško Kokić; 18.01.2014
comment
Если вы используете jsify, я совершенно уверен, что добавление элемента в объект dart не влияет на объект Js. - person Alexandre Ardhuin; 18.01.2014
comment
Используя ваш пример, последняя строка выводит null - person Draško Kokić; 18.01.2014