2017-02-14 4 views
0

저는 각도 w/rxjs를 사용하여 인터페이스에서 사용자 이벤트를 관찰하고 있습니다. 그러나 화살표 함수의 메서드에 인수를 전달하면이 간단한 문제가 발생합니다.arrow 함수가 인수를 전달하지 않는 이유는 무엇입니까?

이를을 작동하지 않습니다 : SEARCHTERM은 this.searchFacilities

ngOnInit() { 
this.searchTerm$.subscribe(searchterm => this.searchFacilities);/**Not working here**/ 
} 

searchFacilities(term: string){ 
    console.log(term); 
    this.facilityservice.searchFacilities(term) 
    .subscribe(results => this.facilityList = results); 
} 

에 전달되지 않는하지만이 작품 : 여기에 문제는

this.searchTerm$.subscribe(searchterm => { this.searchFacilities(searchterm); }) 

을 분명히 본인은이 솔루션은 꽤 고통 스럽지만 실제로 첫 번째 접근 방식이 작동하지 않는 이유를 알고 싶습니다. 감사!

+0

'SEARCHTERM => this.searchFacilities' =='function (searchterm) {return this.searchFacilities}'this가'this.searchFacilities (searchterm)'를 호출해야하는 이유는 무엇입니까? O.o – Andreas

+1

그냥'this.searchTerm $ .subscribe (this.searchFacilities);'를 참조 할 때 *를 참조하십시오. – adeneo

+0

나는 마지막 스 니펫이 잘 작동하는지 의심한다. – Bergi

답변

1

작은 설명. 의사는 subscribe()에 콜백을 전달해야하며이 콜백은 관찰 가능 항목에서 방출 한 값을 수신해야한다고 말합니다.

우리는이처럼 쓸 수 있습니다 : 귀하의 경우

const myCallBack = (val) => console.log(val); 
Observable.range(0, 3).subscribe(myCallBack); 

를 이미, this.searchFacilities을 콜백 있습니다.

this.searchTerm$.subscribe(this.searchFacilities); 

을 당신이 내 원래의 예를 다시 작성할 수 있습니다 것처럼 :
이것은 단순히 쓸 수 있다는 것을 의미합니다 즉

// Now `console.log` is the callback! 
Observable.range(0, 3).subscribe(console.log); 

, 문제는 "왜 화살표 함수가 전달되지 인수"아니다 . 문제는 직접 콜백을 사용하는 대신 콜백 인 화살표 함수를 만든 것입니다.

const myCallBack = (searchterm) => { 
    return this.searchFacilities; 
} 

당신이 볼 수 있듯이, searchFacilities가 호출되지하지도 않으며는 searchterm PARAM을받을 않습니다

코드의 확장 된 버전은 다음과 같을 것입니다.

당신은 (화살표 함수의 구문은 실수 가능성과 교활한 수 있도록 않지만) 다음과 같은 코드를 작성하여 비 화살표 기능과 같은 문제로 실행 한 수

:

const myCallBack = function(searchterm) { 
    return this.searchFacilities; 
} 
+0

이 답변을 제출해 주셔서 감사합니다. 나는 정말로 무슨 일이 벌어지고 있는지 이해하고 싶었고, 나는이 대답이 모든면을 다루고 있다고 믿는다 .... 정말로 똑같은 문제가 ES5 함수 구문으로 만들어 질 수있다. 원래, 하나의 함수 만이 본문에서 참조 될 때 화살표 함수가 매개 변수를 자동으로 전달한다는 잘못된 인상을 받았습니다. 이는 사실이 아닙니다. 하지만 이제는 subscribe가'this.searchFacilities'에서 이미 가지고 있던 콜백을 찾고 있다는 것을 이해합니다. – calbear47

+0

안녕하세요. 의견을 보내 주셔서 감사합니다. 진실을 말하면서, 나는 이미 대답 한 질문에 대한 대답을 제출해야하는지 확신 할 수 없지만 S.O. 지식 공유 및 모범 사례 홍보에 관한 것입니다. :) 화살 기능에 대해 기억해야 할 것들이 두 가지 있습니다. 1)'this' 키워드는 ES5 함수처럼 함수 자체에 묶여 있지 않습니다. 2) 몸체가 하나의 명령/표현식 만 포함 할 때, 당신은'{...} '을 생략 할 수 있고 암시 적'return'을 얻을 수 있습니다. 당신이 말했듯이 매개 변수의 함축적 인 전달은 없습니다. – AngularChef

0

searchTerm에 대한 참조가 나오기 때문에 아무 것도하지 않습니다. 당신은 단지 this.searchTerm$.subscribe(this.searchFacilities)을 할 수 있고 그 용어는 함수에 전달 될 것입니다.

2

매개 변수가 함수에 직접 전달되지 않았기 때문에.

the doc에서

예 :

Rx.Observable.range(0, 3).subscribe(function (x) { console.log(x) }); 

화살표 함수와 같은 예 :

Rx.Observable.range(0, 3).subscribe(x => console.log(x)); 
+1

Gotcha, 내 함수에 매개 변수를 직접 전달한 것 같아서 고마워. – calbear47

+1

* "매개 변수가 함수에 직접 전달되지 않았기 때문에."* 무슨 뜻입니까? OP 코드의 문제점은 'this.searchFacilities'를 호출하지 않았습니다. –

+0

Felix의 의견에 +1 GG의 대답 (그리고 그 문제에 대한 중재자의 질문)은 문제를 일으키는 것처럼 들리지만 화살표 함수는 para를 통과하지 않습니다. 미터. 그러나 진짜 문제는'this.searchFacilities'가 호출되지 않는 원래의 코드에서 ** 논리 오류 **가 더 많다는 것입니다. 더 압축 된 해결책은'this.searchTerm $ .subscribe (this.searchFacilities);'라고 쓰고 화살표 기능의 흔적이없는 곳이다. 자세한 내용은 내 대답을 참조하십시오. – AngularChef

0

당신에게 searchFacilities 함수는 다음 글로벌 범위에서 선언되고,이 같은 ngOnInit 내부이라고 콜백 및 컨텍스트가 더 이상 전역 범위가 아닙니다. 이제 이 ngOnInit e를 가리 킵니다. Object 객체. ngOnInit 객체 내부에서 작업하려면 바인드해야하고 searchFacilities이 ngOnInit 메서드 여야하며 이렇게하면 작동합니다.