【问题标题】:d3.js force layout namespace in a backbone viewd3.js 在主干视图中强制布局命名空间
【发布时间】: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).forcevar 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.CollectionBackbone.Models,每个都有一堆.attributes - 它们被其他d3方法很好地拉动,似乎只是.force.layout是finnicky
  • 您能否发布一个示例,说明另一个 d3 方法如何访问模型上的属性?
  • 完成 - 在底部编辑问题
  • ps。 d3_wrapper 只是一个 来保存整个东西

标签: backbone.js d3.js backbone-views backbone-boilerplate force-layout


【解决方案1】:

我会尝试在您的收藏中使用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
    }
});

【讨论】:

  • 没有骰子。我也可能不清楚 - myModels 是集合中模型的直接数组的昵称 - 所以我给 d3 那个数组,而不是集合。所以 - 我的收藏是Module.thecollection,它的模型是Module.thecollection.models,这就是我要传递的力量。它不会让我打电话给Module.thecollection.models.toJSON(),只有Module.thecollection.toJSON,这并没有真正的帮助,因为它仍然是一个太多的抽象步骤......
  • 我添加了真正的代码,希望它不会那么混乱。我确实需要能够监听变化,所以调用 .toJSON 并不是超级理想的(虽然我想我每次都可以重新 JSON)
  • 嗯。使用getset 函数是我知道触发change 事件的最佳方式。深入了解 Source Code 的强制布局并在适当的位置添加 getset 调用可能是值得的。
  • 可能是真的。那会很痛苦......让我觉得这是一个命名空间问题的是,即使我把它变成超级字面意思,比如projects: [{//json literal list of projects}], setforce: fn() {//force setup function},它也不会改变任何该死的东西。 >.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2013-07-15
  • 2017-03-02
  • 2013-06-29
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
相关资源
最近更新 更多