2014-05-21 56 views
3

我们使用hasMany模型和嵌入子元素。这很好,所以无论何时我称为model.get('children'),一切都正常。如何在需要阻止呼叫时处理Ember中的异步属性?

我们现在已经将这个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只是不返回任何内容,因为它是异步我猜。

现在我可以使用的承诺,并重构我的控制器,以这样的:

controller:{ 
lastChildIsActive: function(){ 
    this.get('model').get('children').then(function(children){ 

    return children.get('lastObject').get('isActive'); 

    }); 
} 
} 

与第二重构的问题是,我不再返回isActive值,我现在回来了承诺对象。

但模板不需要承诺,它需要返回值。

那么,如何确保异步已经加载,同时能够返回实际的调用结果而不是承诺?

+0

不能你把观察者就可以了,然后当值可用模板更新? – Sukima

回答

2

通过使用视图和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

你必须使用观察者来倾听儿童的变化。请参阅我在以下lastChildIsActive方法中所做的更改。由于儿童是一种阵列类型,我正在倾听“每个孩子。@”。每当“childern”发生变化时,lastChildIsActive将自动更新。

controller:{ 
lastChildIsActive: function(){ 
    return this.get('model').get('children').get('lastObject').get('isActive') 
}.property('[email protected]') 
} 
+0

@manikadran,谢谢!但是,我想要的价值,而不是当它发生变化时,明白我的意思?我得到了你的解决方案,但是如何帮助我在模板中。当我有(#if lastChildIsActive)在车把中时,我知道得到正确的值...? – andy