我是Backbone的新手,我认为我误解了模型中get / set的使用。我用IPython小部件做了一个非常简单的例子:
class Automaton(widgets.DOMWidget):
from IPython.display import Javascript
_view_name = traitlets.Unicode('AutomatonView', sync=True)
nodes = traitlets.List(sync=True)
%%javascript
require(['widgets/js/widget'], function(WidgetManager){
var AutomatonView = IPython.DOMWidgetView.extend({
render: function(){
var n_nodes = this.model.get("nodes").slice();
n_nodes[0] += 1;
this.model.set("nodes", n_nodes);
return this;
},
});
WidgetManager.register_widget_view("AutomatonView", AutomatonView);
});
所以现在我可以像这样调用小部件:
a = Automaton(nodes=[1])
我在这里理解的是:节点被传递给模型,现在在模型nodes = [1]中,然后我创建了一个我正在设置模型的新节点[2],所以我期望节点值现在为[2],但如果我问
a.nodes
据说:
[1]
对不起,如果我不明白一些非常基本的东西,如果你能解释这里发生的事情对我来说真的很有用。我检查了n个节点是否[2]带有控制台日志,并且它很好,所以它确实是“this.model.set”的问题。
答案 0 :(得分:0)
您确定要呈现视图吗?尝试将此代码放入initialize
方法中,一切都应该正常工作。顺便说一下,即使没有set
方法调用,这也应该有效:
initialize: function() {
var n_nodes = this.model.get("nodes");
n_nodes[0] += 1;
return this;
},
答案 1 :(得分:0)
也许这可以帮助别人,但我通过添加
修复了我的错误this.touch();
我在这个例子中找到了答案:http://nbviewer.ipython.org/github/ipython/ipython/blob/2.x/examples/Interactive%20Widgets/Custom%20Widgets.ipynb
“我们调用this.touch()让小部件机器知道哪个视图改变了模型非常重要”