Ошибка Ember cli с ember-simple-auth

Я пытаюсь использовать ember-simple-auth с пользовательским сеансом. После входа в систему, когда я пытаюсь получить доступ к сеансу в шаблоне, например:

{{session.current_user.email}}

Я получаю следующую ошибку:

Uncaught Error: Assertion Failed: Required contextualElement for view <Ember._HandlebarsBoundView:ember375> is missing

если я перезагружаю страницу, ошибка исчезает. Кроме того, если я использую несвязанный помощник, он исчезает:

{{unbound session.current_user.email}}

У меня есть следующий код для установки current_user при изменении user_id:

import Session from 'simple-auth/session';
import Ember from 'ember';

export function initialize(container) {
  Session.reopen({
    setCurrentUser: function() {
      var id = this.get('user_id');
      var _this = this;
      if(!Ember.isEmpty(id)) {
        return container.lookup('store:main').find('user', id).then(function(user){
          _this.set('current_user', user);
        });
      }
    }.observes('user_id')
  });
}

export default {
  name: 'authentication',
  before: 'simple-auth',
  initialize: initialize
};

Что я делаю неправильно?

Редактировать №1:

Куда бы я поместил этот код? Инициализатор? app/sessions/custom.js?

export default Session.extend({
  currentUser: function() {
    var userId = this.get('user_id');
    if (!Ember.isEmpty(userId)) {
     return this.container.lookup('store:main').find('user', userId);
    }
  }.property('user_id')
});

Затем в environment.js я установил:

ENV['simple-auth'] = {
  session: 'session:custom'
}

а в инициализаторе я прописываю кастомную сессию?

container.register('session:custom', Session);

Редактировать № 2:

Пользовательский сеанс перемещен в sessions/custom.js. Все та же ошибка:

Cryptic Ember Error


person Kori John Roys    schedule 14.01.2015    source источник


Ответы (2)


Я бы определил метод currentUser для сеанса, который возвращает пользователя как обещание:

export default Session.extend({
  currentUser: function() {
    var userId = this.get('user_id');
    if (!Ember.isEmpty(userId)) {
     return this.container.lookup('store:main').find('user', userId);
    }
  }.property('user_id')
});

Также вам лучше определить свой собственный класс сеанса клиента, который расширяет класс Ember Simple Auth Session, вместо того, чтобы открывать его повторно.

person marcoow    schedule 15.01.2015
comment
исходный вопрос, по-видимому, не смог получить форматирование кода в комментарии. - person Kori John Roys; 15.01.2015
comment
Вы помещаете сеанс в app/sessions/custom.js, и если вы используете самый последний интерфейс командной строки Ember, вам не нужно регистрировать его в контейнере — просто настройте ENV['simple-auth'].session = 'session:custom' - person marcoow; 15.01.2015
comment
Спасибо за вашу помощь до сих пор marcoow. Упростил большую часть моего кода. Тем не менее, все то же сообщение об ошибке. См. редактирование № 2. Существуют ли какие-то особые правила для доступа к сеансу в шаблоне? - person Kori John Roys; 15.01.2015
comment
Хм, на самом деле должно работать именно так, см. пример здесь: github.com/simplabs/ember-simple-auth/blob/master/examples/. Какие версии Ember, Ember Data и т. д. вы используете? - person marcoow; 15.01.2015
comment
Давайте продолжим обсуждение в чате. - person Kori John Roys; 16.01.2015
comment
столкнулся с похожей проблемой... каково было окончательное решение? - person Xander; 23.02.2015

Подобно тому, что сказал Маркоу, но мы используем объект обещания:

app/initializers/simple-auth-session.js

import Session from 'simple-auth/session';
import DS from 'ember-data';

export default {
  name: 'simple-auth-custom-session',
  before: 'simple-auth',
  initialize: function(container) {
    Session.reopen({
      currentUser: function() {
        return DS.PromiseObject.create({
          promise: container.lookup('store:main').find('user', 'me')
        });
      }.property()
    });
  }
};
person Asgaroth    schedule 15.01.2015