我们使用的是带有嵌入子项的hasMany的模型。这很好,所以每当我调用model.get('children')时,一切都正常工作。
我们现在已经将那些children属性更改为async:true,我似乎无法找到有关如何处理此问题的正确文档。
让我举个例子。我将使用简化的json来表示我的Ember设置,只是为了简单起见。
说我有这样的模型:
model:{
hasMany: {children: {async: true} },
isActive: boolean
}
说我有这样的模板:
{{#if lastChildIsActive}}
<p>I'm the last one!</p>
{{/if}}
我有一个控制器:
controller:{
lastChildIsActive: function(){
return this.get('model').get('children').get('lastObject').get('isActive')
}
}
好的,所以在使用async:false时使用此设置,一切正常。
但是现在,使用async true,在.get('children')控制器中调用SOMETIMES只是没有返回任何内容,因为我认为它是异步的。
现在我可以使用promises,并将控制器重构为:
controller:{
lastChildIsActive: function(){
this.get('model').get('children').then(function(children){
return children.get('lastObject').get('isActive');
});
}
}
第二个重构的问题是,我不再返回isActive值,我现在正在返回promise对象。
但是模板不需要承诺,它需要返回值。
答案 0 :(得分:2)
通过使用view和didInsertElement,您可以获取父项的子项,然后更新控制器上的属性,该属性将显示在模板中。
App.IndexView = Ember.View.extend({
didInsertElement: function() {
controller = this.get('controller');
controller.get('model').get('children').then(function(children){
active = children.get('lastObject').get('active');
controller.set('lastChildIsActive', active);
});
}
});
看到这个小提琴:http://jsfiddle.net/f9DAc/2/
答案 1 :(得分:1)
你必须使用观察者来监听孩子们的变化。请参阅下面lastChildIsActive
方法中所做的更改。由于孩子是阵型,我正在听孩子们。@ every&#34;。每当&#34; childern&#34;发生变化时,lastChildIsActive
将自动更新。
controller:{
lastChildIsActive: function(){
return this.get('model').get('children').get('lastObject').get('isActive')
}.property('children.@each')
}