当我需要阻止调用时,如何处理Ember中的异步属性?

时间:2014-05-21 10:43:34

标签: javascript asynchronous ember.js promise rsvp-promise

我们使用的是带有嵌入子项的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对象。

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

那么,我怎样才能确保async已经加载,同时能够返回调用的实际结果而不是promise?

2 个答案:

答案 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')
}