Ember: this.get возвращает геттер (вместо объекта, который я на самом деле хочу)

#jquery #object #asynchronous #ember.js #getter

#jquery #объект #асинхронный #ember.js #геттер

Вопрос:

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

 this.get('controllers.application.user')
  

Я получаю:

 Object { content: Getter, 3 more… }
  

Вместо:

 {first_name: 'Ashton', X more...}
  

Странно, что получение свойства этого объекта работает нормально, например:

 this.get('controllers.application.user.first_name')
  

ВОЗВРАТ 'Ashton' . Ниже приведен контекст, в котором отображается мой код, я был бы признателен за любую помощь, которую вы можете предложить.

 App.IndexController = Ember.ArrayController.extend({
    needs: ['application'],
    actions: {
        createPost: function () {
            var writing = this.get('newContent');
            if (!writing.trim()) { return; }
            var post = this.store.createRecord('post', {
                writing: writing,
                author: this.get('controllers.application.user')
            });
            this.set('newContent', '');
            post.save();
        }
    }
});
  

Комментарии:

1. Пожалуйста, опубликуйте код, в котором задан пользователь

Ответ №1:

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

 this.get('controllers.application.user.content')
  

Когда вы это делаете this.get('controllers.application.user.first_name') , Ember знает, что нужно искать внутри содержимого свойство first_name, таким образом, вы получаете возвращаемое значение свойства.

Ответ №2:

Есть ли какая-либо причина, по которой вы помещаете его в данные Ember? Это просто кажется дополнительной работой почти без выгоды (если вы не планируете много редактировать пользователя и т. Д.).

Из того, что я вижу, похоже, вы хотите, чтобы пользователь был доступен везде. Я бы рекомендовал использовать контейнер для регистрации пользователя на всех ваших контроллерах / маршрутах.

 App.initializer({
  name: "appUser",
  after:['ember-data'],

    initialize: function (container, application) {
      // if you want to use the store
      var store = container.lookup('store:main'),
          user = App.CoolUser.create();

      Ember.$.getJSON('api/users/me', function(data) {
        for(var key in data.user){
          user.set(key, data.user[key]);
        }
      });
      application.register("my:user", user, {instantiate:false});
      application.inject("controller", "user", "my:user");
      application.inject("route", "user", "my:user");
    }
});
  

А затем с любого контроллера / маршрута у вас есть прямой доступ к вашему пользователю с помощью:

 this.user....
  

http://emberjs.jsbin.com/OxIDiVU/711/edit

Если важно, чтобы пользователь был извлечен до того, как что-либо произойдет, вы захотите deferReadiness , и advanceReadiness как только произойдет обратный вызов. Если вы пойдете по этому пути, вам также нужно подготовиться к неудачному обратному вызову, чтобы не оставлять ваше приложение в состоянии остановки. http://emberjs.com/api/classes/Ember .Application.html#toc_routing

 App = Ember.Application.create();
App.deferReadiness();
  

   Ember.$.getJSON('api/users/me', function(data) {
    for(var key in data.user){
      user.set(key, data.user[key]);
    }
    application.advanceReadiness();
  });
  

http://emberjs.jsbin.com/OxIDiVU/712/edit

Комментарии:

1. Я принял ответ Мэтью, потому что он прямо ответил на заданный вопрос, но ваш подход меня интригует: каковы были бы возможные последствия, если бы у меня было много моделей DS и отношений между ними, например. другие пользователи, друзья, личные сообщения, сообщения и комментарии? Будет ли пользовательский объект хорошо играть с ними?

2. если вы планируете иметь много связанных моделей, было бы удобно, чтобы он существовал. Достаточно просто создать запись в инициализаторе, используя хранилище. emberjs.jsbin.com/OxIDiVU/719/edit