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);
});