2016-08-12 4 views
0

Я использую контроллер для чтения значения, выбранного в выпадающем меню, для ввода параметров некоторых полей ввода и сохранения записи. Он создает запись и берет информацию просто отлично. Моя проблема заключается в том, что я пытаюсь перейти на другую страницу в конце действия. Я продолжаю получать ошибку: Cannot read property 'transitionToRoute' of undefinedthis.transitionToRoute не работает в моем контроллере Ember

Я полностью в тупике. Есть идеи?

Вот мой код контроллера:

var teamId; 
export default Ember.Controller.extend({ 
    auth: Ember.inject.service(), 
    actions: { 
     onSelectEntityType: function(value) { 
     console.log(value); 
     teamId = value; 
     return value; 
     }, 
     createProcess: function(processName, processDescription) { 
     var currentID = this.get('auth').getCurrentUser(); 
     let team = this.get('store').peekRecord('team', teamId); 
     let user = this.get('store').peekRecord('user', currentID); 
     let process = this.get('store').createRecord('process', { 
      team: team, 
      user: user, 
      name: processName, 
      description: processDescription 
     }); 
     process.save().then(function() { 
     this.transitionToRoute('teams', teamId); 
     }); 
    } 

    } 
}); 

Вот соответствующий маршрут:

export default Ember.Route.extend({ 
    auth: Ember.inject.service(), 
    model: function() { 
     var currentID = this.get('auth').getCurrentUser(); 
     return this.store.find('user', currentID); 
    } 
}); 
+4

'this' не определено внутри функции обратного вызова. Есть десятки, если не сотни сообщений здесь о SO об этом. Самый простой способ - использовать функцию стрелки, как в '.then (() => this.transitionToRoute'. Другой подход - установить переменную' self' в верхней части функции и использовать ее. –

+0

Одна коррекция , есть, вероятно, тысячи, но, честно говоря, это, вероятно, самая распространенная проблема с JavaScript. – Kingpin2k

+0

Посмотрите на этот [ответ] (http://stackoverflow.com/questions/37097598/nesting-functions-in- js/37097783 # 37097783) – ykaragol

ответ

4

Вы должны иметь четкое представление о это ключевое слово в JavaScript. Ключевое слово это зависит только от того, как была вызвана функция, а не от того, как/когда/где она была определена.

function foo() { 
    console.log(this); 
} 

// normal function call 
foo(); // `this` will refer to `window` 

// as object method 
var obj = {bar: foo}; 
obj.bar(); // `this` will refer to `obj` 

// as constructor function 
new foo(); // `this` will refer to an object that inherits from `foo.prototype` 

Посмотрите на MDN documentation, чтобы узнать больше.

Вы можете кэшировать этот в обычной переменной, а затем получить доступ к обратному вызову.

var self = this; 

process.save().then(function() { 
    self.transitionToRoute('teams', teamId); 
}); 

ECMASCript 6 введены функции стрелок, которые лексически ограничены. Здесь это просматривается в области видимости как обычная переменная.

process.save().then(() => { 
    this.transitionToRoute('teams', teamId); 
}); 
+0

Спасибо за это. Это очень помогло мне в понимании ** этого ** –

Смежные вопросы