Минималистический пример двунаправленной связи javascript ядра IPython
Моя цель - написать интерактивный просмотрщик переменных для IPython, то есть который позволяет видеть, скажем, вложенные dicts/lists в виде дерева и развернуть (немного похоже на console.log в Javascript).
Я потратил много времени на извлечение минималистического кода из примера directview в IPython, но до сих пор не могу понять, как все это работает. Мой Python нормально, но мой опыт jQuery довольно ограничен.
Итак, мне пришлось отключить directview.js до следующего
container.show();
var widget = $('<div/>')
element.append(widget);
var output = $('<div></div>');
$(widget).append(output)
var output_area = new IPython.OutputArea(output, false);
var callbacks = { 'output': $.proxy(output_area.handle_output, output_area) };
var code = 'print 1+1'
var msg_id = IPython.notebook.kernel.execute(code, callbacks, {silent: false});
Это работает, когда я загружаю directview.ipynb. Однако я до сих пор не понимаю, как сделать его полностью автономным (т.е. Не требует directview.py и передать другой обратный вызов, чем стандартный handle_output
of IPython.OutputArea
). Одна из проблем - это container.show()
, которая терпит неудачу при вызове автономным способом.
Я теряюсь по нескольким аспектам:
- Почему существует
element.append(widget)
, а затем $(widget).append(output)
? Также возникает необходимость создать IPython.OutputArea
. Разве нет способа просто создать <div id=my_output_area>blah</div>
, а затем выполнить обратный вызов output
с соответствующими данными?
- О чем вся эта вещь .proxy? Я хотел бы создать свой собственный обратный вызов для
output
, но когда я это сделаю и console.log()
аргументы, переданные обратному вызову, они undefined
или просто бесполезны.
Я ценю, что авторы ноутбука IPython сделали невероятную работу, создав такой красивый интерфейс, используя jQuery/websockets, и что создание документации разработчика, которая позволяет новичкам, как и мне, настраивать их, очень много, но если кто-то может протянуть руку, которая будет здорово!
Ответы
Ответ 1
Я могу ответить на ваш второй вопрос. Дело в том, что JavaScript вызывает ваш обратный вызов, поэтому он делает это без указания контекста, т.е. Без установки this
(Pythonistas называет его self
). Но возможно привязать функцию к this
через $.proxy
, которую вы видели в:
var callbacks = { 'output': $.proxy(output_area.handle_output, output_area) };