2015-01-17 6 views
1

Это скорее общий вопрос, чем что-либо конкретное, но я новичок в ember и не понимаю, когда и как использовать this.get Ember ('foo'). (и аналогично bar.get ('foo')).разъяснение метода This.get() Ember's

Например, в моем маршруте у меня есть пользовательский объект, на котором есть свойство называется кредиты

user = this.store.find('user', userId) 
console.log(user) 
credits = user.get('credits') 
console.log(credits) 

мой console.log показывает мне, что user.content._data.credits имеет значение, а также имеет методы, называемые get content и - точнее - получение кредитов. Тем не менее, кредиты console.logging всегда возвращаются не определены.

если я установил пользователя как модель, хотя, используя this.get ('user.credits') в моем контроллере, отлично работает.

Я прочитал документы о преимуществах .get предложений с вычисленными свойствами, но мог ли кто-нибудь кратко объяснить некоторые основные правила использования этого.get ('foo') vs. bar.get ('foo') и почему это работает в некоторых местах, но не в других.

Спасибо!

+0

Я хотел бы создать условное ограничение по кредитам пользователя, чтобы показывать содержимое на странице. Я предполагаю, что это помещать в маршрутизатор вместо контроллера означает, что представление загрузится с правильным содержимым, и не будет возможности прошивки чего-либо неправильного. Любые мысли об этом также будут оценены. – iwoodruff

ответ

4

Для получения и настройки свойств Ember.Object вы всегда должны использовать Em.get и Em.set. Это основное правило. Без него вы можете найти множество ошибок в наблюдателях/рендеринге и других местах.

В коде есть недопонимание операций: this.store.find всегда возвращает объект обещания, а не фактические данные, которые вы запрашиваете. Детальнее:

user = this.store.find('user', userId) // user - Em.RSVP.Promise object 
console.log(user) // logs the Em.RSVP.Promise object 
credits = user.get('credits') // gets property 'credits' of the Em.RSVP.Promise object (user) 
console.log(credits) // always logs `undefined` because there is no property called 'credits' in Em.RSVP.Promise prototype 

Мы должны полагаться на асинхронной природы Promise и переписать этот код, как это:

this.store.find('user', userId).then(function(user) { 
    console.log(user) // logs the App.UserModel object with actual data 
    credits = user.get('credits') // gets property 'credits' of the App.UserModel instance (user) 
    console.log(credits) // logs real data from the model 
}); 

Существует еще одна важная часть получения свойств из объекта модели, если вы используя данные ember-data в качестве уровня данных: вам нужно объявить все поля модели, которые вы хотите после этого get.

+0

Удивительно, это было очень полезно. Спасибо, что спасли мою задницу в ember во второй раз. – iwoodruff