0

Я работаю над средним сложным приложением, использующим backbone.js для обработки данных Wordpress, и я не могу понять, как заставить силу работать в макете.d3.js пространство пространства макета пространства в представлении позвоночника

в основном, я пытаюсь создать экземпляр макета силы в макете магистральная шаблонный, как это:

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, потому что приложение слишком сложное, поэтому извините заранее об этом. Текущая версия до 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); 
} 
+0

Что содержит 'переменная myModels'? – Ben

+0

это набор 'Backbone.Models' из' Backbone.Collection', каждый из которых имеет кучу '.attributes' - они отлично натягиваются другими методами d3, это просто' .force.layout', который кажется быть finnicky – defenestrated

+0

Вы опубликовали бы пример того, как другой метод 'd3' получает доступ к атрибутам на моделях? – Ben

ответ

0

Я хотел бы попробовать использовать 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 
    } 
}); 
+0

нет кости. Я также был неясен - myModels был прозвищем для прямого массива моделей внутри коллекции, поэтому я даю d3 этот массив, а не коллекцию. поэтому - моя коллекция - 'Module.thecollection', а ее модели -' Module.thecollection.models', и это то, что я перехожу к силе. он не позволит мне называть 'Module.thecollection.models.toJSON()', только 'Module.thecollection.toJSON', что на самом деле не помогает, потому что это еще один слишком много шагов, абстрагированных ... – defenestrated

+0

Я добавил реальный кода, так что, надеюсь, он будет менее запутанным.Я должен быть в состоянии слушать изменения, поэтому вызов .toJSON не является супер идеальным (хотя я полагаю, что каждый раз мог бы просто повторять JSON) – defenestrated

+0

Хмм. Использование функций 'get' и' set' является наилучшим способом, который я знаю для запуска событий «change». Возможно, стоит окунуться в [Исходный код] (https://github.com/mbostock/d3/blob/master/src/layout/force.js#L190) для компоновки сил и добавить 'get' и 'set' вызывает в соответствующих местах. – Ben

Смежные вопросы