#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();
});
Комментарии:
1. Я принял ответ Мэтью, потому что он прямо ответил на заданный вопрос, но ваш подход меня интригует: каковы были бы возможные последствия, если бы у меня было много моделей DS и отношений между ними, например. другие пользователи, друзья, личные сообщения, сообщения и комментарии? Будет ли пользовательский объект хорошо играть с ними?
2. если вы планируете иметь много связанных моделей, было бы удобно, чтобы он существовал. Достаточно просто создать запись в инициализаторе, используя хранилище. emberjs.jsbin.com/OxIDiVU/719/edit