2016-07-12 11 views
9

私はmodulesシステムを使用してマップを作成しています。私は多かれ少なかれD3.js v3に慣れていますが、私はまだv4に慣れています。d3.js v4でエクスポートを再バインド

ディスパッチを追加しようとしていますが、V4でエクスポートを再バインドする方法がわかりません。この機能は現在使用できません。

だから私の派遣(_dis)と私の特定のイベント(「変更タイプ」)のために、D3 v3では、再バインドは、例えば、輸出を返す前に、右のようになります。

d3.mapDots = function (districts){ 

    var _dis = d3.dispatch('changetype'); 

    (...) 

    exports.color = function(_c){ 
     if(!arguments.length) return color; 
     color = _c; 
     return this; 
    };  

    d3.rebind(exports,_dis,"on"); 
    return exports 
    }; 

、誰もが行う方法を知っていますこれはv4でですか?私はdispatch.applyしようとしていますが、動作しません。

ありがとうございます!

答えて

10

良い質問です。ディスパッチオブジェクトが多少changedで、d3.rebindが存在しないようです。後者がなくなったため、.on()メソッドを(d3.rebindで)コピーする方法はないようです。代わりに、自分で実装する必要があります。 See hereボストックの実装方法d3-brush

私はthis jsFiddleをまとめ、あなたが求めていることをD3 v4でどのように達成するかを実証します。

重要なビットが.onメソッド実装されています

instance.on = function() { 
    var value = dispatcher.on.apply(dispatcher, arguments); 
    return value === dispatcher ? instance : value; 
} 

をそして、ディスパッチがこの

dispatcher.call("was_clicked", this, "Hello, Foo!"); 
+0

のように説明してくれてありがとうです! 私はそれがより良い方法を理解しています...私の発送はまだアクティブではありません。私は2つの異なるファイル(メインファイルのscript.jsと 'exports.on = function()'があるマップを作成するためのもの)を持っていますが、それが原因かもしれませんね? ありがとう! – Irene

+0

@Irene私があなたに質問したことを理解していれば、彼らは別のファイルに入っていても問題ありません。重要なのは、 'exports.on = function(){...}'がインスタンシエーター関数内に存在するということです(あなたの場合、 'd3.mapDots = function(district){...}'の中にあります)。そうであれば、メインスクリプトが 'mapDots'スクリプトを適切にインポートしていれば、別々のファイルに入っていても問題ありません(' d3.mapDots() 'をエラーなしで呼び出せればそれは適切にインポートされます)。 – meetamit

+0

あなたの問題を再現するjsFiddleを作ることができるはずです。それが問題を解決するのに役立ちます。 – meetamit

関連する問題