使用RESTAdapter在Ember数据模型上使用计算属性的异常

时间:2013-05-23 04:04:57

标签: ember.js ember-data

所以我在使用ember数据和RESTAdapter的ember.js应用程序中基本上有以下两个模型。

App.JobsController = Ember.ArrayController.extend({
  completedCount: function() {
    return 0; //Doesn't matter what I return here.
  }.property('content.@each.state')
});

App.Job = DS.Model.extend({
  transactions: DS.hasMany('App.Transaction'),
  state: function() {
    return 0; //Doesn't matter what I do here
  }.property('transactions.@each.transactionType')
});

App.Transaction = DS.Model.extend({
  job: DS.belongsTo('App.Job'),
  transactionType: DS.attr('number')
});

我遇到的问题是transactions.@each.transactionType的存在会导致以下异常:

"Attempted to handle event `becomeDirty` on <App.Transaction:ember462:1> while in state rootState.loaded.materializing.firstTime. Called with undefined"

我无法在问题队列或堆栈溢出的任何其他位置找到对此的任何引用。我做错了什么?


更新

所以我做了一些更多的调查,并且在原帖中没有说清楚。我已经更新了代码以反映它。

1)我在计算属性中做了什么并不重要。只是拥有它们会导致异常。

2)只有在有另一个取决于原始属性的计算属性时才会发生异常。 (希望有意义)

所以在上面的例子中,JobsController有一个计算属性,它基于Job模型的计算属性。

2 个答案:

答案 0 :(得分:0)

尝试依赖于isLoaded:

state: function(){
  return this.get('isLoaded') ? this.get('transactions.lastObject.transactionType') : null;
}.property('isLoaded', 'transactions.@each.transactionType')

答案 1 :(得分:0)

因为事务是一个Ember数组,你应该测试的是确定他是否有数据的长度...尝试类似:

state: function(){
    var transactions = this.get('transactions');
    var lastObject = transactions.get('length') > 0 ? transactions.get('lastObject') : null;
    return lastObject !== null ? lastObject.get('transactionType') : null;
}.property('transactions.@each.transactionType')