2017-02-14 9 views
0

Я использую угловые w/rxjs для наблюдения за пользовательскими событиями на интерфейсе. Тем не менее, у меня есть эта очень простая проблема с передачей аргументов методу в функции стрелки. Вот проблема:Почему функция стрелки не передает аргументы?

Это не работает: 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.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); 

Другими словами, проблема не «Почему стрелка функция не проходящие аргументы» , Проблема заключается в том, что вы создали функцию стрелки, тело которой IS ваш обратный вызов, а не только ваш обратный вызов напрямую.

расширенная версия кода будет выглядеть следующим образом:

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

Как вы можете видеть, searchFacilities не является ни вызывается и не получить searchterm параметров.

Вы могли бы работать в одной и той же задачи с помощью функции NON-ARROW, написав следующий код (хотя синтаксис функций стрелок делает ошибку более вероятно, и коварный):

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

Я рад, что вы представили этот ответ. Я действительно хотел понять, что происходит, и я считаю, что этот ответ охватывает все стороны. То, что действительно утонуло, заключается в том, что эту же проблему можно создать с помощью синтаксиса функции ES5. Первоначально я был под ложным впечатлением, что функция стрелки будет автоматически передавать параметры, когда на тело ссылается только одна функция .... что неверно. Но теперь я также понимаю, что подписка просто ищет обратный вызов, который у меня уже был в 'this.searchFacilities'. – calbear47

+0

Эй, calbear. Спасибо за ответ. По правде говоря, я не был уверен, должен ли я ответить на уже ответивший вопрос, но с S.O. говорит о том, чтобы делиться знаниями и продвигать лучшие практики. :) В основном есть две вещи, которые вам нужно запомнить о ** теле ** функций стрелки: 1) ключевое слово 'this' не связано с самой функцией, как с функциями ES5; 2) когда тело содержит только ONE инструкцию/выражение, вы можете опустить '{...}', и вы получите неявный '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

* «Потому что параметр не передается непосредственно вашей функции». * Что вы подразумеваете под этим? Проблема с кодом OPs заключается в том, что их не называет 'this.searchFacilities'. –

+0

+1 комментарий Felix. Ответ GG (и вопрос о том, что вопрос Calbear в этом отношении) заставляет задуматься, как проблема - функция стрелки, не проходящая пара метров. Но настоящая проблема - скорее логическая ошибка ** в исходном коде, приводящая к тому, что 'this.searchFacilities' не вызывается. Более компактным решением было бы написать 'this.searchTerm $ .subscribe (this.searchFacilities);' там, где нет следа функции стрелки. См. Мой ответ для деталей. – AngularChef

0

You searchFacilities функция объявлена ​​в глобальной области, а затем называется внутри ngOnInit как обратный вызов и его контекст больше не являются глобальным охватом, теперь это указывает на ngOnInit e lement Object. Чтобы работать внутри объекта ngOnInit, вам необходимо связать его, а затем searchFacilities быть методом ngOnInit и таким образом его работать.