2009-10-15 4 views
0

저는이 문제에 대한 저의 머리를 감싸기 위해 노력해 왔습니다. 많은 자습서와 사이트에서 개별 이벤트 객체를 만드는 것이 좋습니다. 객체의 어떤 지점에서 일어날 하나의 함수를 구현하기위한 잔인 함프로토 타입 구현을 사용하여 자바 사용자 정의 "이벤트"리스너 OOP

기본적으로 사용되는 개체 내에서 특정 메서드가 호출 될 때 발생시키는 사용자 지정 "onComplete"이벤트가 필요합니다. GMaps 컨트롤 객체가 켜지거나 꺼져 있습니다. 켜져 있으면지도에서 폴리선을 조작 할 수 있지만 꺼지면 조작이 비활성화됩니다.이 시점에서 폴리 라인 데이터를 저장하고 싶습니다. 내가 시도하고있는 것은 객체의 사용자가 꺼진 이벤트를 수신하는 자체 이벤트를 만들고 해당 객체의 폴리 라인 데이터에 액세스 할 수 있도록 허용하는 것입니다. 어떻게해야합니까? 그게 당신이에 대해 물어 것 같다 무엇과 같이 상단 근처의 onComplete 기능을 이동할 수 있습니다

function ToggleLineDrawControl() {} 

ToggleLineDrawControl.prototype = new GControl(); 

ToggleLineDrawControl.prototype._on = false; 

ToggleLineDrawControl.prototype._button = false; 

ToggleLineDrawControl.prototype._map = false; 

ToggleLineDrawControl.prototype._overlay = false; 

ToggleLineDrawControl.prototype._plots = []; 

ToggleLineDrawControl.prototype._line = false; 

ToggleLineDrawControl.prototype._addPlotListener = false; 

ToggleLineDrawControl.prototype._onComplete = false; 

ToggleLineDrawControl.prototype.initialize = function(map) { 
this._map = map; 

var me = this; 

var container = document.createElement('div'); 

var buttonDiv = document.createElement('div'); 
this._button = buttonDiv; 
this.setButtonStyle_(); 
container.appendChild(this._button); 
this._button.appendChild(document.createTextNode('Plot')); 

GEvent.addDomListener(this._button, 'click', function() { 
    if(!this._on) { 
     this.style.backgroundColor = '#333333'; 
     this.style.color = 'white'; 
     this.firstChild.nodeValue = 'Done'; 

     me.startPlotting(); 

     this._on = true; 
    } else { 
     this.style.backgroundColor = 'white'; 
     this.style.color = '#333333'; 
     this.firstChild.nodeValue = 'Plot' 

     me.stopPlotting(); 

     this._on = false; 
    } 
}); 

this._map.getContainer().appendChild(container); 

return container; 
}; 

ToggleLineDrawControl.prototype.getDefaultPosition = function() { 
    return new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(7, 57)); 
}; 

ToggleLineDrawControl.prototype.setButtonStyle_ = function() { 
    this._button.style.textDecoration = 'none'; 
    this._button.style.color = '#333333'; 
    this._button.style.backgroundColor = 'white'; 
    this._button.style.font = 'small Arial'; 
    this._button.style.border = '1px solid black'; 
    this._button.style.padding = '2px'; 
    this._button.style.marginBottom = '3px'; 
    this._button.style.textAlign = 'center'; 
    this._button.style.width = '5em'; 
    this._button.style.cursor = 'pointer'; 
}; 

ToggleLineDrawControl.prototype.setPlot = function(latlng) { 
    var wicon = new GIcon(); 
    wicon.image = 'http://www.site.com/images/waypoint2.png'; 
    wicon.iconSize = new GSize(32, 32); 
    wicon.iconAnchor = new GPoint(8, 28); 

    var marker = new GMarker(latlng, {icon: wicon}); 

    this._map.addOverlay(marker); 

    this._plots.push(latlng); 

    this.drawLines(); 
}; 

ToggleLineDrawControl.prototype.drawLines = function() { 
    var numPlots = this._plots.length; 

    if(this._line != false) { 
      this._map.removeOverlay(this._line); 
    } 

    if(numPlots > 1) { 
     this._line = new GPolyline(this._plots, '#cc0000', 2, 0.75); 

     this._map.addOverlay(this._line); 
    } 
} 

ToggleLineDrawControl.prototype.startPlotting = function() { 
    var me = this; 

    this._addPlotListener = GEvent.addListener(this._map, 'click', function(o, l, ol) { 
     me.setPlot(l); 
    }); 
}; 

ToggleLineDrawControl.prototype.stopPlotting = function() { 
    GEvent.removeListener(this._addPlotListener); 
}; 

ToggleLineDrawControl.prototype.onComplete = function(callback) { 
    this._onComplete = callback // get this to somehow be listener event method 
}; 

답변

0

:

이 지금까지 내 코드입니다.

그러나 나는 흐름을 이해하지 못합니다.

라이브러리를 사용하는 경우 onComplete에 대한 이벤트 처리기로 함수를 전달하려면 프로토 타입 변수 (this._onComplete)에 저장해야하므로 각 개체에는 하나의 콜백 함수 만 있습니다.

어디에서 전화가 왔습니까? if (this._onComplete != false this._onComplete(this);

+0

제임스, 당신의 응답을 감사와 같은

ToggleLineDrawControl.prototype.stopPlotting = function() { ... this._onComplete(this); }; 

작품. 죄송합니다, 물건을 혼동하지만 onComplete() 메소드와 그 객체에서의 사용은 내가 미숙 한 상태로 지연적으로 떠났습니다. 왜냐하면 내가 어디로 가져 가야할지 몰랐기 때문입니다. 이 객체의 사용법에서 객체의 메소드 중 다른 하나가 사용되는 시점에서 객체의 범위를 사용하기 위해 커스텀 메소드를 할당하고 싶습니다. stopPlotting() 같은 메서드가 실행되면 내 초기 생각은 사용자 지정 메서드를 실행하고있었습니다. – qualsh

0

좋아, 전 동료의 도움의 비트와 함께 그것을 해결 : 당신은 당신이 매개 변수로 객체를 전달 콜백을 호출해야한다 완료되면

. 때로는 자신의 머리에서 벗어나 올바른 사람에게 물어봐야 할 때도 있습니다. 어쨌든, 제임스는 제가 처음에는 방법을 부르지 않고 있다는 점에서 옳았습니다.

function ToggleLineDrawControl(options) { 
    this._onComplete = options.onComplete; 
} 

... 그리고이 방법은 전화를받을하려는 stopPlotting() 메소드에 : 그래서, 나의 동료는 옵션으로 주된 목적 함수에서 사용자 정의 함수에 대한 참조를 만드는 제안 : 매력

관련 문제