2013-04-29 75 views
1

我試圖從靜態html SVG(使用動態值)切換到動態d3 SVG在骨幹視圖中。我目前正在使用模板(並希望保持它的某些其他屬性),但不必(因爲我可以用模板將這些屬性重構爲自己的視圖)。使用骨幹渲染d3 SVG的基本示例查看

任何人都有一個乾淨的快速示例,就像只有一個圓圈?

Backbone和我發現的d3最接近的版本是here,但這是我想要的,並且還沒有足夠的d3經驗來理解函數調用和結構。

當前提供該問題的代碼是在視圖的渲染():

var pathFunction = d3.svg.line() 
     .x(function (d) {return d.x;}) 
     .y(function (d) {return d.y;}) 
     .interpolate("basis"); // bundle | basis | linear | cardinal are also options 

    //The Circle SVG Path we draw 
    var svgContainer = d3.select('#measure'+measure.cid); 

    var circle = svgContainer.append("g") 
     .append("path") 
     .data([circleStates[0]]) 
     .attr("d", pathFunction) 
     .attr("class", "circle"); 

    var compiledTemplate = _.template(this.representations[this.currentRepresentation], measureTemplateParamaters); 
    $(this.el).find('.addMeasure').before(compiledTemplate); 

基本上我試圖繪製路徑的圈子,通過已經計算的點來定義。我只是不知道如何得到它傳遞給任何模板或通過Backbone.View

控制檯錯誤時,「珠」是在this頁面選擇的DOM:

Error: Problem parsing d="function line(data) { 
    var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y); 
    function segment() { 
    segments.push("       jquery.js:6326 
jQuery.extend.clean jquery.js:6326 
jQuery.buildFragment jquery.js:6165 
jQuery.fn.extend.domManip jquery.js:5975 
jQuery.fn.extend.before jquery.js:5795 
(anonymous function) measuresView.js:227 
_.each._.forEach underscore.js:78 
Backbone.View.extend.render measuresView.js:133 
Backbone.View.extend.changeMeasureRepresentation measuresView.js:90 
triggerEvents backbone.js:96 
Backbone.Events.trigger backbone.js:187 
Backbone.View.extend.cycle wholeMeasureRepresentationView.js:46 
jQuery.event.dispatch jquery.js:3059 
elemData.handle.eventHandle jquery.js:2677 

這是全錯誤,並且與我的代碼不匹配,導致我相信這看起來好像是在嘗試使用d3的函數並進行渲染,而不是我期望的d3返回。堆棧跟蹤最終將我導回到傳入的編譯模板((anonymous function) measuresView.js:227),這就是我想要弄清的,如何將d3 SVG傳遞到模板中。

+1

您發佈的這個示例非常完整。你錯過了什麼部分?如何呈現模板,然後使用d3.js注入內容? – 2013-04-29 19:00:08

+0

你必須發佈一些更多的代碼,並且除了可以複製問題的代碼之外,還可以包含一個jsFiddle。 – 2013-04-29 19:14:04

+0

我已經儘可能地在這個[fiddle](http://jsfiddle.net/chrisfrisina/6a6da/)中最小化文件,但是,我不知道如何去除require.js,我不認爲該模板正確傳遞爲像'!text'版本那樣的字符串。然而,我確實對網站[這裏](http://compthink.cs.vt.edu:3000)進行了更改,因此您可以看到該錯誤。只需將「度量表示法」切換到Bead,並且您可以在控制檯中看到錯誤。對於完整的代碼,你可以看到它[這裏](http://bit.ly/11SElsU)。 THX爲您提供幫助!嘗試替換爲[this](http://jsfiddle.net/chrisfrisina/6sYAY/) – 2013-04-29 20:11:47

回答

2

您遇到的問題在珠模板中。在模板中,您引用屬性pathFunction,該屬性是一個函數,您應該引用該函數的返回值。只需將pathFunction更改爲pathFunction()即可,假設pathFunction被寫入以返回沒有任何參數的svg路徑,您應該沒問題。如果是這樣的話,這裏就是這樣的模板應該是:

<div id="measure<%= measure.cid %>" class="measure"> 
    <div class="btn" id="a">Unroll</div> 
    <div class="btn" id="b">Rollup</div> 
    <span class="title">Measure <span class="number"><%= measureCount %></span> 
    <% if(measureCount == 1) { %> 
    <% } else { %> 
    - <span class="delete">[X]</span> 
    <% } %> 
    </span> 
    <svg id="svg<%= measure.cid %>" xmlns="http://www.w3.org/2000/svg" version="1.1" class="circular-pie"> 
    <path d="<%= pathFunction() %>" /> 
    <!-- <circle cx="<%= cx %>" cy="<%= cy %>" r="<%= measureR %>" stroke="black" stroke-dasharray="1,3" stroke-width="1" fill="none" /> --> 
    <g id="<%= beatHolder %>"> 
    </g> 
    </svg> 
</div> 

至於你想雖然達到什麼樣的,我想你,你想做的事是使一個SVG元素的一部分您的模板,然後在將HTML附加到DOM後,使用SVG元素作爲您的可視化的根,因此:

// This should be in your view's render function 
    // Render the template 
    var compiledTemplate = _.template(this.representations[this.currentRepresentation], measureTemplateParamaters); 
    // Insert the html into the DOM 
    d3.select('#someContainer').html(compiledTemplate); 
    // Then draw your visualization 
    var pathFunction = d3.svg.line() 
     .x(function (d) {return d.x;}) 
     .y(function (d) {return d.y;}) 
     .interpolate("basis"); 

    //The Circle SVG Path we draw 
    var svgContainer = d3.select('#measure'+measure.cid); 

    var circle = svgContainer.append("g") 
     .append("path") 
     .data([circleStates[0]]) 
     .attr("d", pathFunction(/*you'll need to insert some coordinate 
      information here see http://www.dashingd3js.com/svg-paths-and-d3js*/)) 
     .attr("class", "circle"); 
    // Do some other stuff 
+0

感謝您的幫助。我知道了。我不知道我必須先創建模板,然後應用/附加d3到模板。 – 2013-05-10 02:43:36

0

我認爲這是因爲你使用相同的字符串分隔符"爲你的xml和你的函數。 JQuery試圖解析你編譯好的模板,並且無法評估在'd'屬性中停止在...segments.push(處的函數。

segments.push("M"更改爲segments.push('M'segments.join("")分成segments.join(''),你應該沒問題。

+0

這是JQuery代碼。那不是我的代碼。我將代碼中的所有雙引號更新爲單引號,沒有任何更改,同樣的錯誤。我更新了github鏈接以顯示新代碼。我認爲這是在編譯模板,並且我沒有正確傳遞參數或正確編譯模板。 – 2013-04-30 13:38:15