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
}
});