#ember.js #coffeescript
#ember.js #coffeescript
Вопрос:
У меня есть функция входа в систему на контроллере, и я не могу понять, почему свойства ‘MessageClass’ и ‘message’ отображаются как неопределенные, когда я пытаюсь установить их в обратном вызове ‘fail’ в запросе post. Они устанавливаются нормально, если я беру их за пределы обратного вызова. Я предполагаю, что это как-то связано с обещаниями, но я не знаю, почему у него не было бы доступа к определенным выше свойствам. Любая помощь очень ценится.
App.UsersLoginController = Ember.ArrayController.extend
message: ''
messageClass: ''
actions:
login: ->
email = @get 'email'
password = @get 'password'
url = "http://localhost:3000/api/v1/sessions/login"
data = email: email, password: password
request = $.post(url, data, (data)->
console.log(data)
).fail((response)->
@set 'messageClass', 'error'
@set 'message', 'Wrong email or password'
)
Комментарии:
1. Я полностью разнес, что контекст «this» изменился внутри обратного вызова fail, поэтому он больше не ссылается на контроллер.
2. @MatthewBlancarte Это феномен. Я узнаю больше о coffeescript каждый день.
Ответ №1:
Вы можете использовать жирную стрелку, чтобы исправить это.
(data) =>
Для не-кофе (мое предпочтение):
function (data) {
this.doSomething(); // This function was cloned and returned with outer "this" context
}.bind(this)
Или:
var self = this;
function innerScope () {
self.doSomething(); // outer "this" was cached as a variable.
}
Надеюсь, это поможет!
Ответ №2:
Мне нужно было ссылаться на «это» извне функции, как сказал @MatthewBlancarte выше:
request = Em.$.post(url, data, (data)=>
Em.run =>
@set 'messageClass', 'success'
@set 'message', 'All GOOD!'
).fail((response)=>
Em.run =>
@set 'messageClass', 'error'
@set 'message', 'Wrong email or password'
)
Двойная стрелка указывает на то, что функция ссылается на «this» контроллера.
Комментарии:
1. Спасибо! Рад, что смог помочь!