2015-09-27 18 views
6

Tôi đang chuyển đổi một số mã Javascript thành Typecript. Đây là một chức năng Javascript thú vị sử dụng d3 và kết thúc tốt đẹp một khối văn bản svg hoàn hảo. Thông thường tôi sẽ chỉ thay đổi từ "function" thành "private" và hàm sẽ hoạt động như trong Typescript, nhưng cái này chỉ phàn nàn về hàm getComputedTextLength(). Sẽ là tuyệt vời nếu ai đó có thể giải thích làm thế nào tôi có thể làm cho chức năng này làm việc trong Typescript cho bản thân mình và những người khác, bao gồm cả lý do tại sao tôi nhận được lỗi. Visual Studio không hỗ trợ. Cảm ơn.Chuyển đổi chức năng Javascript thành Typecript bao gồm getComputedTextLength()

function wrap(text, width) { 
    text.each(function() { 
     var text = d3.select(this), 
      words = text.text().split(/\s+/).reverse(), 
      word, 
      line = [], 
      lineNumber = 0, 
      lineHeight = 1.1, // ems 
      y = text.attr("y"), 
      x = text.attr("x"), 
      dy = parseFloat(text.attr("dy")), 
      tspan = text.text(null).append("tspan") 
       .attr("x", x).attr("y", y).attr("dy", dy + "em"); 
     while (word = words.pop()) { 
      line.push(word); 
      tspan.text(line.join(" ")); 
      if (tspan.node().getComputedTextLength() > width) { 
       line.pop(); 
       tspan.text(line.join(" ")); 
       line = [word]; 
       tspan = text.append("tspan") 
        .attr("x", x).attr("y", y) 
        .attr("dy", ++lineNumber * lineHeight + dy + "em") 
        .text(word); 
      } 
     } 
    }); 
} 
+0

Và mô tả lỗi là gì? – Buzinas

+0

Thuộc tính 'getComputedTextLength' không tồn tại trên loại 'Element' – blissweb

+0

Mã này là từ Mike Bostock https://bl.ocks.org/mbostock/7555321 – 0x4a6f4672

Trả lời

6

Một cách có thể được sử dụng khẳng định (ví dụ chúng ta nói đến nguyên cảo biên dịch - Tôi biết những gì sẽ được trả về loại đây). Vì vậy, đây có thể là giải pháp

Thay vì điều này:

while (word = words.pop()) { 
    line.push(word); 
    tspan.text(line.join(" ")); 
    if (tspan.node().getComputedTextLength() > width) { 

Chúng ta có thể sử dụng này (ví dụ ở đây chờ đợi nút đó nên SVGTSpanElement)

while (word = words.pop()) { 
    line.push(word); 
    tspan.text(line.join(" ")); 
    var node: SVGTSpanElement = <SVGTSpanElement>tspan.node(); 
    var hasGreaterWidth = node.getComputedTextLength() > width; 
    if (hasGreaterWidth) { 

Các 'SVGTSpanElement' đến từ một chung lib.d.ts

+0

Chắc chắn khắc phục sự cố. :-) Bạn là một siêu sao. Cảm ơn rất nhiều. – blissweb

+0

Thật tuyệt vời khi thấy điều đó! ;) Thưởng thức Typecript, sir ... –

+0

Tuyệt vời, cảm ơn! Ngoài ra, bạn có thể rút ngắn dòng chỉ 'var node = tspan.node(); ' – kolobok

Các vấn đề liên quan