2016-02-12 3 views
1

Я следую this tutorial, чтобы узнать, как масштабировать svg. Вот мой код.D3 zoom - Невозможно прочитать свойство «apply» of undefined

var vis = d3.select("#svg-canvas").append("svg") 
 
    .attr("width", "550") 
 
    .attr("height", "400") 
 
    .append("g") 
 
    .attr("class", "svg-container") 
 
    .attr("transform", "translate(550,400)") 
 
    .call(zoom); 
 

 
vis.append("rect") 
 
    .attr("x", 10) 
 
    .attr("y", 10) 
 
    .attr("width", 100) 
 
    .attr("height", 40) 
 
    .style("fill", "#444"); 
 

 
var zoom = d3.behavior.zoom() 
 
    .scaleExtent([1, 10]) 
 
    .on("zoom", zoomed); 
 

 
function zoomed() { 
 
    d3.select(".svg-container").attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")"); 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<div id="svg-canvas"> 
 

 
</div>

Но я получаю сообщение об ошибке в консоли, которая говорит следующее

Uncaught TypeError: Cannot read property 'apply' of undefined.

Что я делаю неправильно?

ответ

2

Когда вы используете .call (zoom), ваш переменный масштаб не определен.

Его следует определить в первую очередь.

var zoom = d3.behavior.zoom() 
 
    .scaleExtent([1, 10]) 
 
    .on("zoom", zoomed); 
 

 
var vis = d3.select("#svg-canvas").append("svg") 
 
    .attr("width", "550") 
 
    .attr("height", "400") 
 
    .append("g") 
 
    .attr("class", "svg-container") 
 
    .attr("transform", "translate(550,400)") 
 
    .call(zoom); 
 

 
vis.append("rect") 
 
    .attr("x", 10) 
 
    .attr("y", 10) 
 
    .attr("width", 100) 
 
    .attr("height", 40) 
 
    .style("fill", "#444"); 
 

 
function zoomed() { 
 
    d3.select(".svg-container").attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")"); 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script> 
 
<div id="svg-canvas"> 
 

 
</div>

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