d3.js принудительно создает пространство имен макета в магистральном представлении

Я работаю над средне-сложным приложением, использующим 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);
}

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
    }
});
Другие вопросы по тегам