2016-11-18 59 views
0

我有两个在month属性更改后应触发的计算属性。然而,其中只有一个发生火灾,另一个没有发生。应该触发并进行API调用的计算属性根本不会触发(Ember 2.8)

classesForMonth在初始化时触发一次(当month第一次设置时)并且在此之后不触发。

我认为这可能是由classesForMonth.content语法造成的,我必须在模板中使用它来呈现在查询DS之后从Promise接收到的对象。

请帮助我走上正确的轨道。

classesForMonth: function() { 
    console.log('hi im querying store') // doesn't fire on month change 
    return this.get('store').query('class', { 
     month: this.get('month') + 1, 
    }); 
    }.property('month'), 

    formattedMonth: function(){ 
    console.log('hi im formatting month') // does fire on month change 
    return moment.months()[this.get('month')] 
    }.property('month') 
+0

您使用的是什么版本的余烬? –

+0

我正在使用Ember 2.8。 – Senthe

+0

你在模板中使用formattedMonth吗? – GerDner

回答

2

其实这计算的属性看起来非常好。我已经建立了一个小小的twiddle以显示它正在工作。

可能你的问题是你没有正确使用它。有几件事要注意:

  • 计算属性只有在它们被消耗时才被执行。如果您显示在您的模板或.get()它否则,它不会计算。
  • store.query返回DS.PromiseArray
  • .content属性是承诺没有默认值。它是DS.PromiseArrayDS.PromiseObject独有的私有API。而且,既然它是私人的,你真的不应该使用它
  • 在计算属性中返回一个普通的Promise并不好。返回PromiseArrayPromiseObjet即可。
  • 如果您有PromiseObjectPromiseArray,您可以在模板中将它用作普通对象。忽略承诺的东西。
  • store.query应该返回多条记录。如果你只想要一个使用store.queryRecord

所以基本上,如果你只是做类似

{{#each classesForMonth as |class|}} 
    ... 
{{/each}} 

这将工作!

0

因为你是从查询某处你在某些情况下它是不明智的一个计算的属性中返回一个承诺,你可能会更好用observers这样的:

classesForMonth: null 
changeClasses: Ember.observer('month', function() { 
    this.set('classesForMonth', this.get('store').query('class', { 
     month: this.get('month') + 1, 
    })); 

    // or maybe better to avoid calling `.content` in you template 
    this.get('store').query('class', { 
     month: this.get('month') + 1, 
    })).then(classes => this.set('classesForMonth', classes)); 
}) 
+0

请注意解释返回承诺并在模板中调用'.content'有什么不对?到目前为止,我还没有遇到过问题(除了这个由我自己的愚蠢造成的问题之外)。 – Senthe

+0

它不是“余烬之道”;)。它工作,如果你只想显示的东西。但是,您可能会失去自己的约束力从模板中设置东西时。另外,像你这样的错误正在发生。如果你想实际使用它作为一个计算属性。可能想看看@kumkanillams的答案。 –

+0

@Senthe因为'PromiseProxyMixin'上的'.content'是私人的。这应该是足够的理由。然而,它*是*保存以返回一个'PromiseProxyMixin'并在模板中使用'property.someProperty'。只是不要使用“内容”。 – Lux