Internals - zziuni/d3 GitHub Wiki
Wiki ▸ API Reference ▸ Core ▸ Internals
재사용 가능한 컴포넌트 구현을 위한 유틸리티 모음
# d3.functor(value)
value 가 함수면 그 함수를 그대로 반환하고 그렇지 않으면 지정한 값을 반환하는 함수를 반환한다. 어떤 프로퍼티가 함수 또는 상수 어느 것으로든 지정될 수 있을 경우 이 메서드가 상수값을 함수로 만드는 느슨한 방법으로 내부에서 사용된다. 예를 들어 대부분의 D3 레이아웃이 프로퍼티를 이 방법으로 지정하고 있는데, 내부에서 자동으로 상수값을 함수로 변환하고 있으므로, 코드구현이 간단해 진다.
# d3.rebind(target, source, names…)
지정한 name 의 메서드를 source 에서 target 으로 복사한 후 target 을 반환한다. 전달인자가 없이 호출하는 메서드라면, 실행 후 값을 반환하는 "getter" 모드이고 전달인자가를 가지고 호출하는 메서드라면 실행 후 target 이 반환되는 "setter" 모드이다. 상속된 메서드(mix-ins)는 rebind 연산자로 다른 객체의 서브클래스로 엮일 수 있다.
D3는 사용자 정의 이벤트를 다루기 위해서 디스패처를 사용한다.
# d3.dispatch(types…)
지정한 types 를 위한 신규 디스패처 객체를 생성한다. 각 전달인자는 "zoom", "change" 같은 이벤트 타입명을 나타내는 문자열이다. 반환 객체는 각 타입명이 디스패처 객체와 연결된 연관개별이다. 예를 들어, "start"와 "end" 이벤트를 위한 이벤트 디스패처가 필요하면 아래처럼 할 수 있다.
var dispatch = d3.dispatch("start", "end");그러면 event.start와 event.end 처럼 각각의 이벤트 타입을 위한 디스패처에 접근할 수 있다. 예를 들어, 필요하면 다음처럼 이벤트 리스너를 추가한다.
dispatch.on("start", listener);그리고 나서 등록된 모든 리스너로 이벤트를 전달한다.
dispatch.start();리스너에 전달인자를 전달하는 더 상세한 방법은 dispatch를 참조한다.
# dispatch.on(type[, listener])
지정한 type 을 위한 이벤트 listener 를 추가하거나 제거한다. type 은 "start", "end"같은 이벤트 타입명 문자열이다. listener 는 caller로 결정된 컨텍스트와 전달인자로 실행된다. dispatch를 참고하라.
해당 타입에 이미 이벤트 리스너가 등록되어있다면, 신규 리스너를 추가하기 전에 이전 리스너를 제거한다. 같은 이벤트 타입에 여러 리스너를 등록하려면 "click.foo", "click.bar"처럼 타입명에 네임스페이스가 따라붙어야 한다.
"listener" 를 전달인자로 넘기지 않으면 지정 type 에 현재 할당된 리스너를 반환한다. 물론 있을 경우.
# dispatch.type(arguments…)
앞에서 설명한 dispatch.start 같은 메서드를 type 메서드라하는데, type 메서드는 등록된 리스너 별로 지정한 arguments 를 전달한다. this 컨텍스트는 등록된 리스터의 컨텍스트로 사용된다. 예를 들어 등록된 모든 리스너가 foo 컨텍스트와 bar 전달인자로 실행하기를 원한다면 dispatch.call( foo , bar ) 를 호출한다. 이와같이 여러분은 원하는 리스너로 어떤 전달인자를 전달할 수 있다. 일반적으로는 이벤트를 나타내는 객체나 해당 datum( d )와 index( i )를 통해 전달되는 객체를 만든다. 여러분은 또한 call나 apply를 사용해서 리스너의 "this" 컨텍스트를 제어할 수도 있다.
예를 들어 네이티브 "click"의 컨텍스트와 전달인자를 계승한 "사용자 정의" 이벤트가 필요하면 다음처럼 작성한다.
selection.on("click", function(d, i) {
dispatch.custom.apply(this, arguments);
});