ã¯ããã«
æè¿ãããªãè€éãªé«åºŠãªUIã䜿çšãã倧èŠæš¡ãªãããžã§ã¯ããå®äºããŸããã 詳现ã説æããããšãªãããã©ãŠã¶å ã«ãã¹ã¯ãããã®ãããªãã®ããŠã£ã³ããŠããªãŒããŒã©ãããããã³ãã®ãã¹ãŠãå®è£ ãããŠãããšããŸãããã ãã¡ãããã¡ã¢ãªãªãŒã¯ã®åé¡ã¯è§£æ±ºããŸããã§ããã ççŽã«èšã£ãŠãåœåã®éãç§ãã¡ã¯ããžãã¹çµæãåŸãããšã«çŠç¹ãåãããŸããã æãã¡ã¢ãªãªãŒã¯ã«éãããšããã©ãŠã¶ãŠã£ã³ããŠãã®ã¬ãã€ãã®RAMãå æããŠããããšãçºèŠãããŸããã ç§ãã¡ã¯ãšã©ãŒãåé¡ããäžè¬ã«ãããã®é€å»ãžã®ã¢ãããŒããçå®ããŸããã ãã®ã¢ãããŒããçãããšå ±æããããšæããŸãã
ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã®ã¡ã¢ãªãªãŒã¯ã®ãããã¯ã«ã€ããŠã¯ããã§ã«å€ãã®ããšãæžãããŠããŸãã åœåãäž»ãªåé¡ã¯ãã©ãŠã¶IE8ããã³ãã以åã®ããŒãžã§ã³ã§ããïŒäŸïŒ
http://habrahabr.ru/post/141451/
http://habrahabr.ru/post/146784/
https://learn.javascript.ru/memory-leaks ïŒã
ããããä»ãIE8ãéå»ã«ãããšèšãããšãã§ãããšããåé¡ã¯æ®ããŸãã TypeScriptãªã©ã®èšèªã䜿çšããŠããããããååšããªãããšã¯ä¿èšŒãããŸããã ãŸããWebã¢ããªã±ãŒã·ã§ã³ã®ããã³ããšã³ããããè€éã«ãªã£ãŠãããšããäºå®ãèãããšãåé¡ã®é¢é£æ§ã¯é«ãŸãã ãã§ãã
ãšã©ãŒã®åå
ç§ãã¡ãèªåã§ç¹å®ãããªãŒã¯ã®äž»ãªåå ã¯æ¬¡ã®ãšããã§ãã
- jQueryãŠã£ãžã§ãã
- ã«ã¹ã¿ã ããã¯ã¢ãŠããã€ã³ãã£ã³ã°
- ãããªãã·ã¥/ãµãã¹ã¯ã©ã€ãã¢ãŒããã¯ãã£ãå®è£ ãã
- çŽæã䜿ã
- D3
- Googleããã
å ãèŠæ®ããŠãæåŸã®é ç®ãæãåé¡ãåŒãèµ·ããããšèšããŸãã æ®å¿µãªããããŸã£ãã解決ã§ããªããã®ããããŸãã ããã«ãããããããããã§ã¯åŠå®çãªçµæãæå°éã«æããããšãã§ããŸãã
ã¯ãªãŒã³ã¢ãããã³ãã©ãŒã®äœ¿çšãã¿ãŒã³
ç¹å¥ãªã¢ãžã¥ãŒã«ã§ã¯ãªãŒãã³ã°æäœãå²ãåœãŠãŸããïŒ
import ed = require('disposing');
ãã®ã¢ãžã¥ãŒã«ã«ã¯ã衚瀺ããããã¥ãŒã«é¢é£ä»ããããåé€ã€ãã³ããã³ãã©ã®ããªãŒã§æ¬è³ªçã«æ§æãããed.Disposablesã€ã³ã¿ãŒãã§ã€ã¹ãå«ãŸããŠããŸãã ãããã®ãã³ãã©ãŒã¯ããªããžã§ã¯ãã®äœææã«ç»é²ããããšæ³å®ãããŸãã ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒå ã
äŸãåç §ããŠãã ããã
class MapControl { constructor( ⊠private beDisposed : ed.Disposables // ⊠) { ... beDisposed(beDisposed => { ⊠// } ); }
ãã¥ãŒã®äžéšãäžèŠã«ãªã£ããšããããšãã°ã¢ãã«ãŠã£ã³ããŠãéãããšãããŸãã¯ããŒãžãé¢ãããšãã«ãããªãŒã®äžéšãåé€ããå¿ èŠããããŸãã
ulo.enableWindowUnloadTracking(window, function () { ed.disposeAll(beDisposed, 'window unloading'); ey.nullify(window, 1, ec.alwaysTrue); });
ãã®ã¢ãããŒãã§ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ãèŠãŠã¿ãŸãããã
1. jQuery-ãŠã£ãžã§ãã
çŸä»£ç掻ã§ã¯jQueryã©ã€ãã©ãªãŒãæŸæ£ããåŸåããããŸãããå€ãã®å ŽåãjQueryã©ã€ãã©ãªãŒãªãã§ã¯å®è¡ã§ããŸããã çŸäžã®åŒ·åãªãŠã£ãžã§ããã®è»éã¯å€§ããªåœ¹å²ãæããããã®å€ãã¯éåžžã«éèŠã§äŸ¿å©ãªæ©èœãå®è£ ããŠããŸãã
ãŠã£ãžã§ããã䜿çšããäžè¬çãªæ¹æ³ã¯ãã©ãããŒãªããžã§ã¯ãã§ãŠã£ãžã§ããããã©ãããããããšã§ãã次ã«äŸã瀺ããŸãã
export function toCheckbox( $element: JQuery, options: CheckboxOptions ) : JQuery { return $element.jqxCheckBox(options); }
åé¡ã¯ããŠã£ãžã§ããã®æ§ç¯åŸãjQueryã»ã¬ã¯ã¿ãŒïŒ$èŠçŽ ïŒãžã®åç §ãã©ãããŒãªããžã§ã¯ãã«æ ŒçŽãããããšã§ãã ãã®ãããªãªã³ã¯ã¯ããªããžã§ã¯ããšå¯Ÿå¿ããDOMèŠçŽ ã®éã«åŸªç°äŸåé¢ä¿ãäœæã§ããŸãã ãããã£ãŠããã®ãããªãªã³ã¯ã¯ãã¡ã¢ãªã¯ãªãŒãã³ã°ã¡ã«ããºã ãããªã¬ãŒããããšãã«ãã¯ãªãŒã³ã¢ãããããå¿ èŠããããŸãã ãã®ã±ãŒã¹ã§ã¯ãjQueryã»ã¬ã¯ã¿ãŒãšjQueryã»ã¬ã¯ã¿ãŒãªã³ã¯ã®ããŒãåãã®ããã«åŒã³åºãããç¹å¥ãªnullifyé¢æ°ãããã«äœ¿çšãããŸãã
// -c jQuery- export function toCheckbox( beDisposed: ed.Disposables, $element: JQuery, options: CheckboxOptions ) : JQuery { ed.append(beDisposed, function disposeJqxCheckbox() { if ($element != null) { let instance = $element.jqxCheckBox('getInstance'); // jQuery- $element.jqxCheckBox('destroy'); // '' jQuery- ed.nullify(instance, 1); // '' $element = null; options = null; beDisposed = null; } }); return $element.jqxCheckBox(options); }
ãããã£ãŠããŠã£ãžã§ããã®ãã¹ãŠã®å¯èœæ§ãæé€ãããã®DOMè¡šçŸã¯ãã¯ãªãŒã³ã¢ãããããŠããªãããŸãŸã§ãã
2.ã«ã¹ã¿ã ããã¯ã¢ãŠããã€ã³ãã£ã³ã°
äžè¬ã«ãDOMèŠçŽ ã衚瀺ãããå Žåã¯åžžã«ããªãŒã¯ãæ éã«ç£èŠããå¿ èŠããããŸãã Konckoutã®äž»ãªç®çã¯ã¢ãã«ãšãã¥ãŒãé¢é£ä»ããããšãªã®ã§ãDOMèŠçŽ ãæ éã«ç®¡çããããšãéèŠã§ãã
次ã®äŸã§ã¯ããªããžã§ã¯ãã¯ã¡ã¢ãªå ã§ããã³ã°ããããŸãŸã§ãã ã€ãã³ãåŠçãDOMèŠçŽ ã«ãã€ã³ãããŸãã
init: function (element: HTMLElement, âŠ) { let beDisposed = xko.toBeDisposed(element); $(document).on('keypress', 'input,textarea,select', function (e) { $(element).on('keypress', 'input, textarea, select', function (e) { ... }); }); }
ãããã£ãŠãããã«å¿ããŠããããã»ã©ãå¿ èŠããããŸãã
init: function (element: HTMLElement, âŠ) { let beDisposed = xko.toBeDisposed(element); $(document).on('keypress', 'input,textarea,select', function (e) { $(element).on('keypress', 'input, textarea, select', function (e) { ... }); }); ed.appendUntied(beDisposed, () => { $(element).off('keypress'); $(document).off('keypress'); }); }
3.ãããªãã·ã¥/ãµãã¹ã¯ã©ã€ãã¢ãŒããã¯ãã£ãå®è£ ãã
ãããªãã·ã¥/ãµãã¹ã¯ã©ã€ãã¢ãŒããã¯ãã£ã¯ãæ¥ç¶ãæžããããã®å žåçãªææ³ã§ãã ç§ãã¡ã®ãããžã§ã¯ãã§ã¯ããã®ææ³ã¯ã·ã°ãã«ïŒSignalsïŒã®åœ¢åŒã§å®è£ ãããŸããã ããã§ã®åé¡ã¯ããªããžã§ã¯ããæ¢ã«åé€ãããåŸãæ¢åã®ã·ã°ãã«ãã³ãã©ãŒããã®ãµãã¹ã¯ãªãã·ã§ã³ã®è§£é€ãåå ã§çºçããå¯èœæ§ããããŸãã ã³ãŒãã«ã€ãã³ããžã®ãµãã¹ã¯ãªãã·ã§ã³ãå«ãŸããŠããå Žåããã®ãµãã¹ã¯ãªãã·ã§ã³ãããµãã¹ã¯ã©ã€ãã解é€ããå¿ èŠããããŸãã ç¹ã«ã³ãŒã«ããã¯é¢æ°ã«åç¶æéã®çããªããžã§ã¯ããžã®ãªã³ã¯ãå«ãŸããŠããå Žåãç»é²è§£é€ã®æ¬ åŠã«ã¯å€§ããªãªãŒã¯ã䌎ããŸãã ããããæå®ãããhtmlèŠçŽ ã®ã¯ãªãã¯ã€ãã³ãã®ãµãã¹ã¯ã©ã€ãã解é€ããã·ã°ãã«ã®äŸã䜿çšããŠèª¬æããŸãã
class Button implements ucb.Component { // , public justClicked = es.toActSignal(); private noMoreOpt : () => void = null; constructor( // private beDisposed: ed.Disposables, private stopPropogation: boolean ) { ⊠} attach(element: HTMLButtonElement): void { // click html-, this.noMoreOpt = ue.listenToUntil( this.beDisposed, element, 'click', (event: MouseEvent) => { if (this.stopPropogation) { ue.stopEventPropagation(event, 'Event blocked by a button component.'); } // this.justClicked(); } ); } detach(): void { // if (this.noMoreOpt != null) { this.noMoreOpt(); this.noMoreOpt = null; } } }
ããã«ãã€ãã³ãããµãã¹ã¯ã©ã€ããããšãã«ããã³ãã©ããªãŒãžã®ãªã³ã¯ãæž¡ãå¿ èŠãããããšã«æ³šæããŠãã ããã
submit.justClicked.watchUntil(beDisposed, () => { // });
4.çŽæãšç«¶åç¶æ ïŒã¯ã©ã€ã¢ã³ãã³ãŒãã®ç«¶åç¶æ ïŒ
JavaScriptã¢ããªã±ãŒã·ã§ã³ã§ããµãŒããŒãžã®ã¢ã¯ã»ã¹ãªã©ã®éåææäœã䜿çšããå¿ èŠãçããå ŽåããããããŸãã ãã®ãããªåé¡ã解決ããããã«ãååãšããŠã圌ãã¯ããããçŽæã䜿çšããŸãã jQueryã®çŽæãŸãã¯äžè¬çãªQã©ã€ãã©ãªã®çŽæã®ããããã䜿çšã§ããŸãããã©ã®ã©ã€ãã©ãªã䜿çšãããã«ãããããããã®ãããªãªããžã§ã¯ããæäœããæ¹æ³ã¯äŒŒãŠããŸãã promiseèªäœã䜿çšããã®ã¯ç°¡åã§ãããå®è£ ãããŠããã·ããªãªã«ãã£ãŠã¯ãå¯äœçšãçºçããå¯èœæ§ããããŸããããã¯ããããã°ããã³åæããŒã«ã®å©ããåããŠåããŠç¢ºèªã§ããŸãã
äŸãšããŠæ¬¡ã®ã³ãŒãã䜿çšããŠããããã競åãŸãã¯ç«¶åç¶æ ã®å ŽåãèããŸãã
// then some.willGetLegendImage(this.beDisposed).then((image) => { model.setLegendImage(image); });
ããã§ã®åé¡ã¯ãåŒã³åºãå ã®ã³ãŒãããããã¹ïŒãã®åŸïŒè¿ããããªããžã§ã¯ããç¡èŠãããã®çµæãé¢æ°ã®å®è¡ããã€å®äºãããããããªãããšã§ãã é¢æ°ã®å®è¡ã¯ã¡ã€ã³ã¹ã¬ããããè±èœããããã§ããã䜿çšããããªããžã§ã¯ãã¯ã³ãŒã«ããã¯ãŸã§ã¡ã¢ãªã«ããã¯ããããŸãŸã§ãã ããã«ãå ã®ãªããžã§ã¯ããåé€ããåŸã«é¢æ°ãæ©èœããå Žåã«ãundefinedãšãã圢åŒã®äŸå€ãçºçããå¯èœæ§ããããŸãã
ããå®å šãªã³ãŒããååŸããã«ã¯ãåŸã§äœ¿çšããããã«promiseãè¿ãå¿ èŠããããŸãã
// promise, then. promise promise, willGetLegendImage. var promise = some.willGetLegendImage(this.beDisposed).then((image) => { // model callback- model.setLegendImage(image); });
ãããã£ãŠããœãŒã¹ãããã¹ã®ç¶æ ãåžžã«ç£èŠãããœãŒã¹ãããã¹ããç¶æ¿ãããthenïŒïŒåŒã³åºãã®çµæãåžžã«è¿ãå¿ èŠããããŸãã ãããã®ãªããžã§ã¯ãã¯ãã€ãã³ããã³ãã©ãŒã®åé€ã¡ã«ããºã ã䜿çšããŠåé€ããããšãã§ããŸãã
5. D3ã©ã€ãã©ãª
ãããžã§ã¯ãã«èŠä»¶ãå®è£ ããããã«ãå©çšå¯èœãªhtmlèŠçŽ ã®ã¿ã§ã¯å®è£ ãå°é£ãªã°ã©ããšå³ã衚瀺ããããšãå¿ èŠã«ãªããŸããã D3ã©ã€ãã©ãªã®æ©èœã«è§ŠçºãããSVGèŠçŽ ãšçµã¿åãããŠäœ¿çšââããããšã決å®ãããŸããã ã©ã€ãã©ãªã®APIã¯æ¯èŒçåçŽã§ãããéçºãããããã¥ã¡ã³ããä»å±ããŠãããå€ãã®å®çšçãªäŸããããŸãããã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããã¹ãã§ã¯ãèšåãããäžé£ã®ãã¥ã¢ã³ã¹ãçããŸããã
5.1ã D3éžæã®æŽæ°
D3ã䜿çšããŠãã°ã©ãããã£ãŒãããã®ä»ã®é¢é£èŠçŽ ïŒã°ã©ãã®è»žãªã©ïŒã衚瀺ããã®ã¯éåžžã«ç°¡åã§ããããšãããããŸããã ãŸããç¬èªã®ããŒã¿ãã€ã³ãã£ã³ã°ã¡ã«ããºã ã®ãããã§ããã¥ãŒãæŽæ°ããããã®ã³ãŒãã¯èªã¿ãããç°¡æœã«èŠããŸããã ãã ããD3ã䜿çšããäžè¬çãªæ¹æ³ã¯ãåé€ãããèŠçŽ ãã¯ãªãŒãã³ã°ããæ©èœã§åžéããå¿ èŠããããŸããã
ããŒã¿ãæŽæ°ãããšãã«ãæŽæ°ãããããŒã¿ãšäžèŽããªããã€ãŸãäžèŠã«ãªãsvgèŠçŽ ã®ãµãã»ãããååŸã§ãããšä»®å®ããã®ã¯è«ççã§ãã å€ãã®å Žåããã¥ãŒãæ§æããèŠçŽ ã¯ããã¥ãŒãæ§æãããšãã«ãä»ã®ã³ã³ããŒãã³ãã§äœ¿çšã§ããŸãããã®ãããªèŠçŽ ã¯ãåé€ããåã«äœããã®æ¹æ³ã§ã¯ãªãŒã³ã¢ããããå¿ èŠããããŸãã ããŒã¿ãã€ã³ãã£ã³ã°åŸãD3 UpdatedSelectionãªããžã§ã¯ããååŸããŸãã ãã®ãããªãªããžã§ã¯ãã«ã¯ãåé€ããã¢ã€ãã ã®ãµãã»ãããžã®ã¢ã¯ã»ã¹ãèš±å¯ããexitïŒïŒã¡ãœããããããŸãã ãã®ã¡ãœããã¯èŠçŽ ã®é åãè¿ããã«ãŒãå ã§äžŠã¹æ¿ããè¡ããã¯ãªãŒãã³ã°ã³ãŒããå®è¡ã§ããŸãã ãã®ãããªæ©èœããªãã以åã«çæãããèŠçŽ ãžã®ãªã³ã¯ãããå ŽåãåŸã§ã¡ã¢ãªã«ãã³ã°ããŠããDOMèŠçŽ ïŒããããåé¢DOMèŠçŽ ïŒãèŠã€ããããšãã§ããŸãã
ããšãã°ãããŒã«ãŒã®è¡šçŸããããŸã-å°å³äžã®ãã€ã³ããåãã€ã³ãã¯ãã®åº§æšã«ãã£ãŠäžããããŸãïŒ
// var markers = this.layer.selectAll('svg.marker') .data(dataItems, d => d.itemId); // markers.enter() .append('svg') .classed('marker', true) .each(function(data) { transform.call(this, data, paddingLeft, paddingTop); }); .each(function(data: DataItem) { // renderMarker.call(this, data, that.renderOptions); }) // SelectManager, markers.each(function(data) { var element = d3.select(this).node(); var markerElement = $(element).find('circle, polygon').get(0); // select.attach(markerElement, dragObjectFrom); }) // DOM- SelectManager markers.exit() .each(function() { var element = d3.select(this).node(); var markerElement = $(element).find('circle, polygon').get(0); // select.detach(markerElement); }) .remove(); // , ,
ãŸãããã®ãããªã¶ãäžããèŠçŽ ã¯ãè¡šçŸã®ãµãããªãŒãåé€ãããšãã§ã¯ãªããåæç»ããã»ã¹äžã«ããã«åé€ããããšã«æå³ãããããšã«æ³šæããŠãã ããã
5.2ã D3ã€ãã³ã
D3ã¯ãã€ãã³ããæäœããããã®ç¬èªã®æœè±¡åãæäŸããŸãã ããšãã°ãããŒã¿ããã€ã³ããããšãããŸãã¯d3.behaviorsïŒãã©ãã°ã移åããºãŒã ãªã©ïŒã䜿çšãããšãã«ãD3ãä»ããŠã€ãã³ãã䜿çšããå¿ èŠãçããå ŽåããããŸãã
ãã¥ãŒãã€ãã³ããåŠçããå¿ èŠããããšæ³å®ãããå Žåãæ¢åã®ãã³ãã©ãŒãã€ãã³ããããµãã¹ã¯ã©ã€ã解é€ããã³ãŒããå¿ èŠã§ãã ãã³ãã©ãŒã®åé€ã¯ç°¡åã§ããã€ãã³ãã®ååãšããŠæååå®æ°ãæå®ãããã³ãã©ãŒé¢æ°ã®ä»£ããã«nullãæž¡ããŸãã
// d3 UpdatedSelection selection.datum(null) // click, dblclick mousedown: .on('click', null) .on('dbclick', null) .on('mousedown', null) // , d3 drag behavior: .on('drag', null) .on('dragstart', null) .on('dragend', null) .on('zoom', null)
ãã¡ããããã®ã³ãŒãã¯ãªããžã§ã¯ãåé€ãã³ãã©ãŒå ã«é 眮ã§ããŸãããé 眮ããå¿ èŠããããŸãã
6. Googleããã
6.1ã ããããªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ã®è©³çŽ°
ãã®ã³ã³ããŒãã³ãã®ãã¹ãŠã®å©ç¹ã掻çšããã«ã¯ãããããªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ã®æ©èœãèæ ®ããå¿ èŠããããŸããäžåºŠããããªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããšããããåé€ããããšã¯ã§ããŸããã Google Map APIã¯ããã®ãªããžã§ã¯ãã®ãã¹ãã©ã¯ã¿é¢æ°ãæäŸããŸããã ãã®åŽé¢ã«ã€ããŠã¯ã https ïŒ //code.google.com/p/gmaps-api-issues/issues/detailïŒid = 3803ã§è©³ãã説æããŠããŸã ã
äžèŠãªã¡ã¢ãªãªãŒã¯ãåé¿ããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ã®æåãããã®ãã¥ã¢ã³ã¹ãèæ ®ããå¿ èŠããããŸãã
ãããã£ãŠãã¡ã¢ãªãªãŒã¯ãæå°éã«æããããã«ãéçºè ã¯ãã®ãããªç¹å®ã®ãªããžã§ã¯ãã®æ éãªäœ¿çšã«æ³šæããå¿ èŠããããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®è©³çŽ°ã«å¿ããŠãäžåºŠäœæãããã«ãŒãã®ã€ã³ã¹ã¿ã³ã¹ãããã°ããããåå©çšããããšããå§ãããŸãã ãŸãã¯ãè€æ°ã®ã«ãŒããåæã«äœ¿çšããå¿ èŠãããå Žåã¯ãããããªããžã§ã¯ãã®ããŒã«ãçšæããŸãã
6.2ã ãããã€ãã³ããšããããªããžã§ã¯ãã®æäœ
- ãããã€ãã³ãã䜿çšããå ŽåãDOMã€ãã³ããšåæ§ã«ããµãã¹ã¯ãªãã·ã§ã³ãã£ãŒã«ãã¯ãã¯ãªãŒã³ã¢ããã³ãŒãé¢æ°ãžã®åç §ãšããŠå éšå€æ°ã«æ ŒçŽããå¿ èŠããããŸãã ãã®ãããªé¢æ°ã®åŒã³åºãã¯ãã³ã³ããŒãã³ãã¯ãªãŒãã³ã°ã³ãŒãã«é 眮ããå¿ èŠããããŸãã
- ããããªããžã§ã¯ãïŒãã€ã³ããã©ã€ã³ãé·æ¹åœ¢ãªã©ïŒãäœæããå Žåãé¢é£ããŒã¿ãã¯ãªã¢ããããŒã«ãŒãžã®ãªã³ã¯ããç¡å¹åãããã€ãã³ããããµãã¹ã¯ã©ã€ãã解é€ããã³ã³ããŒãã³ãã¯ãªãŒãã³ã°ã³ãŒãã§ã¬ã€ã€ãŒããŒã¿ãåé€ããå¿ èŠããããŸãã
import ed = require('disposing'); // disposing, ed ⊠class MapControl { private dispatch: { ⊠}; // (d3) constructor( // private beDisposed : ed.Disposables, ⊠) { ... // ed.append(beDisposed, () => { // this.mapEventsListeners.forEach(listener => google.maps.event.removeListener(listener)); // () google.maps.event.clearInstanceListeners(this.map); this.map.unbindAll(); ea.use(this.markers, (marker: google.maps.Marker) => { marker.setMap(null); marker = null; }); this.markers = null; // DOM-, () var element = this.map.getDiv(); ea.use( ud.toNodeArray(element.getElementsByTagName('img')), (image: HTMLImageElement) => { image.src = ''; } ); ko.cleanNode(element, 'map-control'); // '' this.map = null; }); } }
äžèšã®äŸãããããããã«ããŸãã€ãã³ãã®ãµãã¹ã¯ã©ã€ãã解é€ããŠãããããããªããžã§ã¯ããã¯ãªã¢ããŸãã
çµè«ã®ä»£ããã«
çµè«ãšããŠããªãŒã¯ã®èšºæã«äœ¿çšãããããŒã«ã«ã€ããŠãããã€ãã®èšèãè¿°ã¹ãããšæããŸãã
- IEã®å ŽåãMSDNã«ã¢ããªã±ãŒã·ã§ã³ã®ããŒã«ãšã¡ãœããã®èª¬æãçŽæ¥ãããŸã ïŒ https : //msdn.microsoft.com/en-us/library/dn255003(v=vs.85).aspx
- Google Chromeã®å ŽåïŒ http : //www.smashingmagazine.com/2012/11/writing-fast-memory-efficient-javascript/
- ãŸããYandex http://habrahabr.ru/company/yandex/blog/195198/ããå ¥æããããšããå§ãããŸããããã¯ã空ãã¡ã¢ãªã®éãç£èŠããŠãããšã©ãŒãçŽæ¥é€å»ããããã»ã¹ã詳现ã«èª¬æããŠããŸãã
PSç§ãã¡ãçŽé¢ããããšãšããããã®åé¡ãã©ã®ããã«è§£æ±ºãããã瀺ããŸããã ããªããåæ§ã®çµéšããæã¡ã®å Žåãç§ãã¡ã®æèŠã§ã¯ãåé¡ã«å¯Ÿããäžè¬çãªã¢ãããŒãããŸã éçºãããŠããã®ã§ãããã«ã€ããŠåãã§åŠã³ãŸãã