Подтвердить что ты не робот

Минималистический пример двунаправленной связи 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, и что создание документации разработчика, которая позволяет новичкам, как и мне, настраивать их, очень много, но если кто-то может протянуть руку, которая будет здорово!

4b9b3361

Ответ 1

Я могу ответить на ваш второй вопрос. Дело в том, что JavaScript вызывает ваш обратный вызов, поэтому он делает это без указания контекста, т.е. Без установки this (Pythonistas называет его self). Но возможно привязать функцию к this через $.proxy, которую вы видели в:

var callbacks = { 'output': $.proxy(output_area.handle_output, output_area) };