2015-07-02 4 views
3

Я desesperatly пытаюсь создать объект Anno в методе JSNI, но у меня есть странная проблема: код в jsni-методе не работает, но если я делаю то же самое в моей консоли браузера, он отлично работает.GWT-JSNI, передающий JavaScriptObject во внешней библиотеке JS

Java Часть

Я использую в Wich с JSONArray добавить некоторые JSONObject (со всеми элементами, в соответствии с Anno документ). Вот мой метод JSNI:

// I'm using the getJavaScriptObject() on my JSONArray 
private static native void launch(JavaScriptObject steps)/*-{ 
     var anno = new $wnd.Anno(steps); 
     anno.chainIndex().show(); 
                  }-*/; 

Browser Часть

Просто чтобы быть ясно, метод вызывается на onShow событие, поэтому все Ressources загружаются и отображаются. Поэтому, когда элемент отображается и вызываемая функция, у меня есть эта ошибка в моей консоли:

Не удалось найти Anno.target 'h1'. --- anno.js: 265

NB: В Anno.js h1 является значением dafault цели.

Но мои шаги значение правильно и когда я делаю те же команды в консоли работает:

var testAnno = new Anno([{ 
    content: "namespinnerFrequencyA", 
    position: "center-right", 
    target: ".dataAuto0" 
},{ 
    content: "chooseFrequencyB", 
    position: "top", 
    target: ".dataAuto1"}]); 
testAnno.show(); 

Я не понимаю, почему это работает в одном случае, а не в другом. Я также пытался использовать JSON.stringify, затем JSON.parse, но он тоже не работает.


EDIT:

я понял что-то. При отладке anno.js я понял что: когда я инициализируюсь Anno в консоли, локальная область выглядеть следующим образом (увеличения изображения here):

local scope for the console commands

Но когда я использую метод JSNI, локальная область является совершенно разные, мой параметр сохраняется в качестве фактического массива вместо того, чтобы быть обработан нормально (Увеличенное изображение here):

enter image description here

ответ

2

Проблема заключается в том, что код GWT работает в iframe (для песочницы/изоляции), и Anno поддерживает только типы массивов из того же контекста просмотра.

См. http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/ и http://web.mit.edu/jwalden/www/isArray.html для описания проблемы.

ECMAScript 5.1 добавлена ​​функция Array.isArray(), которая решает эту проблему и имеет широкую поддержку браузера (обратно до IE9): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray
И у jQuery тоже есть одно, что делает его непонятным (для меня), что Anno не использует его, а не использует сломанные if arg.__proto__ is Array.prototype (если это не по дизайну). Итак, сначала сначала: напишите на Anno вопрос.

В качестве обходного пути должно быть возможно использовать $wnd.Array.apply($wnd.Array, steps) для копирования массива в массив из верхнего окна.

+0

Обходной путь работает отлично! Я думал, есть ли более красивый способ сделать это? Например, загрузите библиотеку anno в iframe GWT? Я также попытаюсь использовать ваше первое предложение, оно всегда может быть полезно – Carvallegro

0

мне кажется, что сообщение об ошибке говорит, что не могу найти элемент целевой Dóm и не т он не может найти целевое свойство. Является ли элемент там, когда ваш код запущен? убедитесь, что это так, и вернитесь ко мне.

+0

Согласен, но в этом случае, кажется, что для anno целью является «h1», когда это должно быть «.dataAuto0» или «.dataAuto1». Я собираюсь проверить, действительно ли элементы были обработаны или показаны, я скажу вам – Carvallegro

+0

Проблема на самом деле не с этого момента. Я добавил кнопку, которая вызывает функцию, когда она выбрана (поэтому она должна отображаться для выбора), и снова появляется та же ошибка – Carvallegro

Смежные вопросы