【发布时间】:2013-02-01 15:23:08
【问题描述】:
我正在开发一个使用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,因为该应用程序太复杂了,所以提前抱歉。当前版本已上线here
编辑:以下是 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);
}
【问题讨论】:
-
myModels变量包含什么? -
这是一组来自
Backbone.Collection的Backbone.Models,每个都有一堆.attributes- 它们被其他d3方法很好地拉动,似乎只是.force.layout是finnicky -
您能否发布一个示例,说明另一个
d3方法如何访问模型上的属性? -
完成 - 在底部编辑问题
-
ps。 d3_wrapper 只是一个
标签: backbone.js d3.js backbone-views backbone-boilerplate force-layout