一对多关系中的一个记录的计算属性

时间:2014-07-03 18:50:17

标签: ember.js ember-data

我的数据模型是一个样本,它有很多分析。 (想想可以多次分析的样本。)

我想在样本模型上创建一个计算属性,根据某些条件获取其中一个分析,然后在我的模板中显示一个分析。令我困惑的部分是,许多部分不仅仅是属性,而是承诺,所以我不确定如何在我的计算属性中使用它以及如何在我的模板中显示它。

我的数据模型如下:

// Define datamodels
var attr = DS.attr;

App.Sample = DS.Model.extend({
  note: attr('string'),
  region: attr('string'),
  timeCollected: attr('string'),
  sampleID: attr('string'),
  category: attr('string'),
  approach: attr('string'),
  team: attr('string'),
  location: attr('string'),
  medium: attr('string'),
  instrument: attr('string'),
  asset: attr('string'),
  mission: attr('string'),
  analyses: DS.hasMany('analysis', {async: true}),

  mostImportantAnalysis: function(){
    var analysesPromise = this.get('analyses'); 

    // NOW WHAT ???

    return importantAnalysis.get('result');
  }.property('analyses')  
});

App.Analysis = DS.Model.extend({
  result: attr('string'),   
  timeAnalyzed: attr('string'), 
  method: attr('string'),
  agent: attr('string'),
  sample: DS.belongsTo('sample', { async: true })
});

2 个答案:

答案 0 :(得分:0)

您可以使用promise,就好像它是一个正确加载的对象 -

mostImportantAnalysis: function(){
  var analyses = this.get('analyses'); 

  //For example, to get the analysis with the lowest/highest time:
  mostImportantAnalysis = analyses.sortBy('timeAnalyzed')[0]

  return mostImportantAnalysis.get('result');
}.property('analyses.@each.timeAnalyzed')

请注意,我使该属性依赖于分析。@ each.timeAnalyzed - 这告诉ember每当timeAnalyzed对任何分析进行更改时,它将重新计算以再次找到最重要的分析。

这意味着,虽然分析仍然是一个承诺,但是大多数重要分析都将为空,但是一旦承诺结算,所有timeAnalyzed将会改变并且将计算最重要的分析。

对于您的实际实现,您可以添加用于确定对property()函数调用最重要的分析的任何字段,例如:

属性('分析。@ each.timeAnalyzed','分析。@ each.agent','接近','工具')

对于计算更简单的示例,您可以使用Ember计算属性宏:   http://eviltrout.com/2013/07/07/computed-property-macros.html   http://emberjs.com/api/(参见各种计算宏的apis)

注意:我不能100%确定此函数是否会在promise解析之前运行,但如果确实如此,则可能需要执行null检查以避免错误。

答案 1 :(得分:0)

显然,您需要等待承诺首先解决...以下是最终为我工作的内容:

mostImportantAnalysis: function(){
  var result = "";

  // Make sure the promise resolves before returning
  var analyses = this.get('analyses');
  if(!analyses.get("isFulfilled")) {
    return "";
  }

  result = analyses.objectAt(0).get('result');

  return result;
}.property('analyses.@each.result')