我正在使用backbone.js 处理wordpress 数据的中型复杂应用程序,我不知道如何让力在主干布局中工作。
基本上,我正在尝试在骨干样板布局中实例化强制布局,如下所示:
myLayout = Backbone.Layout.extend({
initialize: function() {
var f = this; // i.e. the layout instance
f.force = d3.layout.force()
.nodes(myModels)
.on("tick", f.tick)
.gravity(0)
.friction(0.9)
.start();
console.log(f.force);
},
tick: function() {
// stuff to do when the force ticks
}
});
问题是力是用所有空白函数定义的,比如gravity: function(x) { //lots of null things here }
. 我很确定这是一个命名空间问题,但我没有尝试任何工作 - 我已经尝试过$(window).force
,,var force
...$this.force
在我的示例tick
中是唯一的命名空间函数,但我也尝试与所有其他函数(重力、摩擦等)一起这样做,但无济于事(即使它们应该只是链接到力对象上)。
有人有想法么?我不能真正发布 .jsfiddle,因为该应用程序太复杂了,所以提前抱歉。当前版本在这里
编辑:这里是 d3 如何成功访问模型:
这有效:
myLayout.nodes = myLayout.d3_wrapper.selectAll(".node")
.data(myModels)
.enter().append("g").attr("class", "node")
.attr("x",10)
.attr("y",10);
myLayout.nodes.append("clipPath")
.attr("id", function(d) { return d.get("slug"); })
就像这样:
myLayout.nodes.append("clipPath")
.attr("id", function(d) { return d.attributes.slug });
编辑:为了清楚起见,这里是非昵称代码:
setforce: function() { // this gets called from the layout's initialize fn
console.log("setting force");
var f = this; // the layout
f.force = d3.layout.force()
.nodes(Cartofolio.elders.models) // Cartofolio is the module, elders is a Backbone Collection
.gravity(0)
.friction(0.9)
.start();
console.log(f.force);
}