3

所以我在使用 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 模型的计算属性的计算属性。

4

2 回答 2

0

因为 transactions 是一个 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')
于 2013-05-23T13:30:54.287 回答
0

也尝试依赖 isLoaded:

state: function(){
  return this.get('isLoaded') ? this.get('transactions.lastObject.transactionType') : null;
}.property('isLoaded', 'transactions.@each.transactionType')
于 2013-05-23T07:13:53.980 回答