Backbone.js d3.js主干视图中的强制布局命名空间

Backbone.js d3.js主干视图中的强制布局命名空间,backbone.js,d3.js,backbone-views,backbone-boilerplate,force-layout,Backbone.js,D3.js,Backbone Views,Backbone Boilerplate,Force Layout,我正在开发一个中等复杂的应用程序,使用backbone.js来处理wordpress数据,但我不知道如何让原力在主干布局中工作 基本上,我尝试在主干模板布局中实例化force布局,如下所示: myLayout = Backbone.Layout.extend({ initialize: function() { var f = this; // i.e. the layout instance f.force = d3.layout.force()

我正在开发一个中等复杂的应用程序,使用backbone.js来处理wordpress数据,但我不知道如何让原力在主干布局中工作

基本上,我尝试在主干模板布局中实例化force布局,如下所示:

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
    }
});
问题是,力是用所有空白函数定义的,比如
重力:函数(x){//这里有很多空的东西}
。我很确定这是一个名称空间问题,但我尝试的方法都不起作用-我尝试过做
$(窗口).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”,函数(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);
}

在将您的收藏传递给
d3
之前,我会尝试使用
toJSON()

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
变量包含什么?它是一组来自
Backbone.Collection
Backbone.Models
,其中每个都有一组
。属性
-它们通过其他d3方法得到很好的利用,只是
.force.layout
似乎是Finnicky。你能举一个例子说明另一个
d3
方法如何访问模型上的属性吗?完成-用底部的问题编辑问题。d3_包装纸只是一个用来装整个东西的包装纸,没有骰子。我也可能不清楚——myModels是集合中模型直接数组的昵称——所以我给d3的是那个数组,而不是集合。所以-我的收藏是
模块。收藏
及其模型是
模块。收藏.模型
,这就是我要传递给force的内容。它不允许我调用
Module.thecollection.models.toJSON()
,只调用
Module.thecollection.toJSON
,这并没有真正的帮助,因为它仍然有太多的抽象步骤……我添加了真正的代码,希望它不会那么混乱。我确实需要能够监听更改,因此调用.toJSON不是非常理想(尽管我想每次都可以重新使用JSON)嗯。使用
get
set
函数是我知道的触发
change
事件的最佳方法。可能值得深入研究force布局的调用,并在适当的位置添加
get
set
调用。可能是真的。那会很痛苦的。。。让我觉得这是一个名称空间问题的原因是,即使我将其设置为超文本,比如
projects:[{//json literal list of projects}],setforce:fn(){//force setup function}
它也不会改变任何东西。