Я использовал self.set('computed_property', value);
технику в большом приложении Ember в течение трех месяцев, и я могу вам сказать, что есть очень большая проблема: вычисленное свойство будет только работать один раз.
Когда вы вычислено значение вычисленного значения, функция, сгенерировавшая результат, теряется, поэтому, когда ваши связанные свойства модели изменяются, вычисленное свойство не будет обновляться.
Использование обещаний внутри вычисляемых свойств в Эмбер хлопот, лучший метод, который я нашел это:
prop: Ember.computed('related', {
// `get` receives `key` as a parameter but I never use it.
get() {
var self = this;
// We don't want to return old values.
this.set('prop', undefined);
promise.then(function (value) {
// This will raise the `set` method.
self.set('prop', value);
});
// We're returning `prop_data`, not just `prop`.
return this.get('prop_data');
},
set(key, value) {
this.set('prop_data', value);
return value;
}
}),
Плюсы:
- Он работает на шаблонах, так что вы можете сделать
{{object.prop}}
в шаблоне и он будет исправляться должным образом.
- Он обновляется при изменении связанных свойств.
Минусы:
- Когда вы делаете в Javascript
object.get('prop');
и обещание решения, он будет возвращать вам inmediately undefined
, однако, если вы наблюдаете вычисленное свойство, наблюдатель будет вести огонь снова, когда обещает решение, и окончательное значение установлено.
Возможно, вам интересно, почему я не вернул обещание в get
; если вы это сделаете и используете в шаблоне, оно отобразит представление строки объекта ([object Object]
или что-то в этом роде).
Я хочу работать в правильной реализации вычисляемого свойства, которая хорошо работает в шаблонах, возвращает обещание в Javascript и автоматически обновляется, возможно, используя что-то вроде DS.PromiseObject или Ember.PromiseProxyMixin, но, к сожалению, я не нашел для этого времени.
Если большой жулик не является проблемой для вашего Прецедент использовать метод «получить/установить», если не пытаться реализовать лучший метод, но серьезно не просто использоватьself.set('prop', value);
, это даст вашему много проблем в долгосрочной перспективе, это не стоит.
PS.: Реальное, окончательное решение для этой проблемы, однако, заключается в следующем: никогда не используйте обещания в вычисленных свойствах, если вы можете избежать этого.
PS.: Кстати, эта техника не моя, а мой бывший сотрудник @ перезагрузка перезагрузки.
Извините, я удалил свои ответы, поскольку они не работают .. :((см. Это для получения дополнительной информации) http://discuss.emberjs.com/t/promises-and-computed-properties/3333] –
Лучшей техникой было бы использование компонента для отображения адреса с учетом lat и lng в качестве входных данных. Он может запускать запрос в его методе 'init' и устанавливать свойство отображения в функции' success'. –
Спасибо за ваш помогите Стиву! Приведенная выше ссылка дала ответ, который работает. Мне это нравится лучше, чем компонентное решение, так как оно поддерживает логику, содержащуюся внутри модели. – codyjroberts