3

我们正在使用带有嵌入子代的 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 为真的情况下,控制器中对 .get('children') 的调用有时不会返回任何内容,因为我猜它是异步的。

现在我可以使用 Promise,并将我的控制器重构为:

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

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

  });
 }
}

第二个重构的问题是,我不再返回 isActive 值,而是返回 promise 对象。

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

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

4

2 回答 2

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/

于 2014-05-22T00:00:55.333 回答
1

您必须使用观察者来监听孩子的变化。请参阅我在lastChildIsActive下面的方法中所做的更改。由于 children 是一个数组类型,我正在监听“children.@each”。每当“childern”发生变化时,lastChildIsActive都会自动更新。

controller:{
 lastChildIsActive: function(){
  return this.get('model').get('children').get('lastObject').get('isActive')
 }.property('children.@each')
}
于 2014-05-21T11:34:58.103 回答