Неопределенное свойство в обратном вызове ajax в свойстве контроллера

#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. Спасибо! Рад, что смог помочь!