Я работаю над приложением средней сложности, используя 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);
}
myModels
? - person Ben   schedule 17.02.2013Backbone.Models
изBackbone.Collection
, в каждом из которых есть куча.attributes
- они отлично вытягиваются другими методами d3, вот только.force.layout
кажется финским - person defenestrated   schedule 17.02.2013d3
получает доступ к атрибутам моделей? - person Ben   schedule 17.02.2013model.get()
, либоmodel.attributes
для доступа к атрибутам. В случае принудительного макета вы просто передаете всю коллекцию вd3
.d3
не узнает, что ему нужно использоватьmodel.get()
илиmodel.attributes
для получения атрибутов ваших моделей. Простым решением может быть передачаmyModels.toJSON()
силовому макету, но тогда вы не получите никаких событийchange
на своих моделях... - person Ben   schedule 17.02.2013