2015-01-08 4 views
0

검색 쿼리가 컨트롤러 상태로 기록되는 철분 라우터를 사용하여 디 바운스 검색을 구현하려고합니다. 불행하게도 나는 일에 _.debounce를 얻을 수있는 유일한 방법은과 같이 이벤트 맵에 직접 전달하는 것입니다 : 이벤트 맵에서 _bounce 및 Iron.controller()

Template.search.events({ 
    'keydown #search': _.debounce(function(event) { 
    var controller = Iron.controller(); 
    }, 750) 
}); 

불행하게도 Iron.controller은() 때문에 에러가 떨어 여기 문맥을 모르는

.

그러나 Ironounce.controller() 함수를 사용하여 debounce를 중첩하면 _.debounce는 실행되지 않습니다.

Template.search.events({ 
    'keydown #search': function(event) { 
    var state = Iron.controller().state; 
    var q = $(event.currentTarget).val(); 
    _.debounce(function() { 
     state.set("q", q); 
    }, 750); 
    } 
}); 

아무도 비슷한 문제를 해결하지 못했습니까?

답변

1

나는 debounce에 익숙하지 않은,하지만 난이 착각하고 있지 않다 경우, 다음과 같은 작업을해야합니다 :

var doIt = _.debounce(function(func){ 
    func() 
}, 750); 

Template.search.events({ 
    'keydown #search': function(event) { 
    var state = Iron.controller().state; 
    var q = $(event.currentTarget).val(); 
    doIt(function(){ 
     state.set("q", q); 
    }) 
    } 
}); 
+0

하지만 왜이 기능이 작동하지 않습니까? _.debounce를 다른 기능으로 옮겨야하는 이유는 무엇입니까? – sclausen

+0

'_debounce (func)'는 래퍼이며, 함수를 반환합니다. 그래서 두 번째 예제에서 랩핑 된 함수를 생성하는 것입니다 ...하지만 결코 실행하지 마십시오. 첫 번째 예에서는 랩핑 된 함수를 속성 (작동)에 할당했으며이 대답에서 Peppe L-G는이를 변수에 할당 한 다음 실행했습니다. 따라서 두 번째 예제에서 구문을 조금 변경하거나 변수에 배치하여이 작업을 수행 할 수도 있습니다. –

0

내가 철 라우터 베어 thisthroughout the code의 공정한 금액을 사용하는 것으로 나타났습니다.

아마도 이벤트 처리기를 디버깅 할 때 범위가 올바르게 설정되지 않았을 수 있습니다. 이 경우, 당신은 this에 바인딩을 시도 할 수 :

Template.search.events({ 
    'keydown #search': _.debounce(function(event) { 
    var controller = Iron.controller(); 
    }.bind(this), 750) 
}); 

은 아마 events에 결합을해야합니다. 이 라이브러리에 익숙하지 않아서 확실하지 않습니다. 두 번째 예로서

, Peppe L-G가 올바르게 제시 등의 기능 디 바운싱 반환하여 debounce 작품. 당신의 예에서는 절대로 그것을 부르지 않습니다!

a = function(){}; 
b = _.debounce(a, 200); 
a() // immediate 
b() // waits 200 millis, calls a() 

또한, 당신이 이벤트 핸들러 내부 디 바운싱 기능을 선언하지 것을주의하는 것이 중요합니다. 그렇지 않으면, 항상 새로운 debounced 함수를 생성 할 것이고, 그것들은 모두 첫 번째 기회에 발사되어 목적을 이길 것입니다.

디버깅 된 처리기의 이름을보다 적절하게 지정하는 것이 좋습니다. 예를 들면 다음과 같습니다.

var handleKeydownEventDebounced = _.debounce(function(controller, query){ 
    controller.state.set("q", query); 
}, 750); 

Template.search.events({ 
    'keydown #search': function(event) { 
    handleKeydownEventDebounced(Iron.controller(), $(event.currentTarget).val()); 
    } 
}); 
+0

불행히도 첫 번째 예제가 작동하지 않습니다. 알려지지 않은 오류 : 현재보기가 없습니다 Peppe L-G의 debounced 기능이 올바른 선택이었습니다 – sclausen