Вы могли бы иметь свойство лениво ставит перед собой, что-то вроде:
App.TopicItem = DS.Model.extend({
topic: DS.belongsTo('topic'),
paddedPosition: function(key, value) {
if (arguments.length > 1) {
// > 1 args = this is a `set`
return value;
} else {
// otherwise this is a `get`
var _this = this;
value = null;
this.get('topic.course.lessons').
then(function(lessons) {
// do stuff based on result
var padded = ...;
// when the promise is resolved, set this property with the value
_this.set("paddedPosition", padded);
// if the promise resolves immediately, set `value` so we return
// the calculated value and not null
value = padded;
});
// returns null if the promise doesn't resolve immediately, or
// the calculated value if it's ready
return value;
}
}.property('topic.course.lessons')
});
Когда это первый доступа он будет стартовым расчет, также в любое время изменить уроки, то он будет установлен в качестве результат расчета, как только это будет сделано.
Это работает, потому что вычисленное свойство вызывается как для get, так и для set, вы можете различать их по количеству аргументов - 1 для get, более 1 для set (раньше это было 2, теперь вы получаете 3 поэтому лучший способ обнаружить -> 1). Подробнее об этом in the docs.
Независимо от того, что возвращается из вычисленного свойства (либо в get или set), кешируется до тех пор, пока его зависимые свойства не изменятся - в этом случае topic.course.lessons
.
В приведенном выше примере, когда приходит первый get
, мы начинаем расчет и возвращаем null
. Теперь это кэшируется как значение свойства, если что-либо еще вызывает это свойство до того, как обещание будет разрешено, оно вернет null
.
После того как обещание будет разрешено, мы вызываем set
по тому же свойству с вычисленным значением. Это мы просто возвращаемся в сеттер и теперь кэшируем как значение свойства.
До изменения зависимых свойств (topic.course.lessons
) или нового значения set
, тогда значение кэширования возвращается из свойства.
похоже, что вам нужно ждать возвращения 'paddedPosition', что-то вроде' topicItem.get ('paddedPosition'). Then (function() {Handlebars.compile() ;}); 'не уверен в ember, но это общий подход :) – roo2
Не уверен, что ждать paddedPosition так же, как пытаться выяснить, разрешает ли Ember.Handlebars обещание автоматически. – alvincrespo