36

我的目标是为 IPython 编写一个交互式变量查看器,即允许人们查看嵌套字典/列表作为树,并向下钻取(有点像 Javascript 中的 console.log)。

我花了很多时间试图从 IPython 中的 directview 示例中提取简约代码,但仍然无法理解它是如何工作的。我的 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_outputIPython.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 notebook 的作者使用 jQuery/websockets 创建了如此漂亮的前端所做的出色工作,并且创建允许像我这样的初学者调整它的开发人员文档要求很多,但是如果有人可以借那会很棒的手!

4

1 回答 1

2

我可以回答你的第二个问题。事实上,当 JavaScript 调用你的回调时,它在没有指定上下文的情况下,即没有设置this(Pythonistas 称之为self)。但是可以将函数绑定到thisvia $.proxy,您在以下代码中看到:

var callbacks = { 'output': $.proxy(output_area.handle_output, output_area) };
于 2013-05-02T04:47:56.333 回答