2016-05-05 5 views
1

私はangular2 webappにd3.js liquid fill gaugeを使用しようとしていますが、clippathは機能しません。つまり、全くウェーブが作成されていません。d3.js液体充填ゲージクリップパスが動作しない

enter image description hereではなくenter image description here

angular2はtypescriptですが実行されているので、私は、構文エラーを修正するために何かを微調整しているので。クリップパスのコードスニペットは次のとおりです。

// The clipping wave area. 
var clipArea = d3.svg.area() 
.x(function(d) { return waveScaleX(d[0]); }) // it was d.x in js version 
.y0(function(d) { return waveScaleY(Math.sin(Math.PI*2*config.waveOffset*-1 + Math.PI*2*(1-config.waveCount) + d[1]*2*Math.PI));}) // it was d.y in js version 
.y1(function(d) { return (fillCircleRadius*2 + waveHeight); }); 

var waveGroup = gaugeGroup.append("defs") 
.append("clipPath") 
.attr("id", "clipWave" + elementId); 

var wave = waveGroup.append("path") 
.datum(data) 
.attr("d", clipArea) 
.attr("T", 0); 

// The inner circle with the clipping wave attached. 
var fillCircleGroup = gaugeGroup.append("g") 
.attr("clip-path", "url(#clipWave" + elementId + ")"); //clippath not working 

fillCircleGroup.append("circle") 
.attr("cx", radius) 
.attr("cy", radius) 
.attr("r", fillCircleRadius) 
.style("fill", config.waveColor); 

どのように修正するかわかりません。変更が可能ですか?return waveScaleX(d.x)return waveScaleX(d[0])に失敗しますか?しかし、typescriptは以前の構文を受け入れません。

+0

あなたはどのようなデータですか? typescriptがどんなエラーを投げていますか? – Mark

+0

@Mark 'd.x'を使用すると、typescriptエラーは' Property 'x'が型[number、number] 'に存在しません。 'data'は' var data = [];のように作成された配列です。 (x i /(40 * waveClipCount)、y:(i /(40))}); for(var i = 0; i = 40 * waveClipCount; i ++){data.push } ' –

+0

だから、私はこの質問に戻りました。私は[この例](http://plnkr.co/edit/hO43jixKR7D3IHWdmV29?p=preview)でエラーを再現することを本当に頑張った。私はtypescriptとangular2(リリース候補)を使用し、エラーを複製することはできません。 – Mark

答えて

1

私はついにあなたのエラーを再現できました。まず、あなたのタイスクリプトファイルにliquidFillGuage.jsをカット/ペーストしないでください。これは非常に多くのレベルでは正しくありません。あなたの質問は、2つの部分に分かれています。どのように含めるべきですか?には、という形容詞が付いています。 angular2、typescript、systemjsには、一般に2通りの方法があります。 1つは、適切なモジュールを使用して、あなたのTSにモジュールをインポート/要求することです。 2つ目は、<script>にあなたの依存関係を設定して、typescriptが認識できるように周囲のモジュールとして設定することです。 d3の場合は前者が動作しますが、liquidFillGuageの場合は後者を使用します。

d3がインストール取得:あなたsystemjs.config.jsで

npm install d3 
typings install d3 

、参照D3:

var map = { 
    ... 
    'd3':       'node_modules/d3/d3.js' 
    ... 
}; 

var packages = { 
    ...  
    'd3':       { defaultExtension: 'js' } 
    ... 
}; 

あなたではindex.htmlにし、liquidFillGuageへ<script src=を含める:

<!-- 1. Load libraries --> 
<!-- Polyfill(s) for older browsers --> 
<script src="node_modules/es6-shim/es6-shim.min.js"></script> 
...  
<script src="some/path/to/liquidFillGauge.js"></script> 

ここでは難しい部分がありますが、どのようにタイプスクリプトにabo ut liquidFillGauge?通常、ほとんどの場合、someone would have created.d.tsファイルです。このようなものについては、あなた自身が必要です。 typings/browser/ambient

、それに追加し、liquidFillGuageという名前のフォルダとindex.d.tsという名前のフォルダ内のファイルを作成します。

declare function loadLiquidFillGauge(i: any, j: any): any; 
declare function liquidFillGaugeDefaultSettings(): any; 

これは、これらの機能と彼らが取るパラメータについてtypescriptですに伝えます。 browser.d.ts

は、この新しいdファイルへの参照を追加します。

/// <reference path="browser/definitions/liquidFillGuage/index.d.ts" /> 

そして最後に、あなたのコンポーネントファイルでは、この新しい環境DEFについてtypescriptです教える:

/// <reference path="../typings/browser/ambient/liquidFillGuage/index.d.ts" /> 

import { Component, ElementRef, Renderer } from '@angular/core'; 
import * as d3 from 'd3'; //<-- we can do this because d3 is a proper module 

... 

// typescript knows about this now! 
var gauge1 = loadLiquidFillGauge("fillgauge1", 55); 
var config1 = liquidFillGaugeDefaultSettings(); 

.... 
+0

私は本当にあなたの親切な助けに感謝します!しかし、残念なことに、これはうまくいかず、「波」はまだすべてのサークルを満たしています。私は2回試みます。 1.私は自分のプロジェクトに使っているので、webpackからd3を参照する以外はあなたのものとまったく同じです。 '/// <参照パス="ブラウザ/定義/ liquidFillGuage/index.d.ts "/>'は '/// <参照パス="ブラウザ/ ambient/liquidFillGauge/index.d.ts "/でなければなりません。 > 'フォルダ構造に従って。 2. 'd.ts'ファイルを作成する代わりに、2つの' declare function'文をコンポーネントに直接追加します。しかし、どちらの試みでも同じ結果が得られます。 –

+0

@BingLu、あなたはあなたのコンポーネントからliquidfillguageを外して、それをスクリプトsrcに入れましたか?あなたが見せているエラーは、タイプスクリプトがそのコードをコンパイルしようとしていると信じさせています。そうすべきではない。 – Mark

+0

ええ、私は完全に私のコンポーネントから 'liquidFillGauge'のコードを削除しました。私は 'src'フォルダの下にフォルダを作成し、' liquidFillGauge.js'をそれに入れ、 '

3

あなたは場所を追加する必要があります。 liquidFillGaugeのクリップパスにhrefを設定します。JS

この:

var fillCircleGroup = gaugeGroup.append("g") 
    .attr("clip-path", "url(#clipWave" + elementId + ")"); 

はこのようになります。

var fillCircleGroup = gaugeGroup.append("g") 
    .attr("clip-path", "url(" + location.href + "#clipWave" + elementId + ")"); 

は、ここで適用される修正と要旨の私のフォークです。 https://gist.github.com/jonbgallant/e85bc5440a4372aff9452e15a4e3276c

関連する問題