0

我正在使用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);
}
4

1 回答 1

0

我会尝试toJSON()在您的收藏上使用,然后再将其传递给d3

myLayout = Backbone.Layout.extend({
    initialize: function() {
        var f = this; // i.e. the layout instance
        f.force = d3.layout.force()
            .nodes(myModels.toJSON())
            .on("tick", f.tick)
            .gravity(0)
            .friction(0.9)
            .start();

        console.log(f.force);
    },
    tick: function() {
        // stuff to do when the force ticks
    }
});
于 2013-02-16T23:11:02.653 回答