2

我已经指出了一些我想看看是否有人可以解释的行为。

我在这里做了一个 jsfiddle http://jsfiddle.net/iceking1624/PpWec/17/。要测试行为,请打开 Web 控制台,只需在“添加问题”按钮旁边的文本字段中输入一些内容,然后点击按钮(“添加问题”)。

以下是DS.Model模式:

App.Session = DS.Model.extend({
   "questions" : DS.hasMany('App.Question') ,
   "firstQuestion" : DS.belongsTo('App.Question')
});
App.Question = DS.Model.extend({
   "session" : DS.belongsTo('App.Session'),
   "choices" : DS.hasMany('App.Choice'),
   "text"    : DS.attr('string')
});
App.Choice = DS.Model.extend({
   "session"  : DS.belongsTo('App.Session'),
   "question" : DS.belongsTo('App.Question'),
   "text"     : DS.attr('string')
});

当我在里面执行以下操作时,SessionController调用该addQuestion函数:

App.SessionController = Ember.ObjectController.extend({
   addQuestion: function() {
      var sessionModel = this.get('model');

      var question = App.Question.createRecord({
         "session" : sessionModel
      });

      this.get('questions').pushObject(question)
   }
});

我收到以下“错误”,但它仍然按预期运行:

错误:断言失败:您在 App.Question 上定义了“会话”关系,但在 App.Session 上发现了多个可能的 App.Question 类型的反向关系。

现在我发现这是因为在里面App.Session我有两个引用的字段App.Question

   "questions" : DS.hasMany('App.Question') ,
   "firstQuestion" : DS.belongsTo('App.Question')

但我想知道为什么 Ember 关心我有多个App.Question关系?尤其是为什么它会抛出错误,但工作得很好。这可能是一个错误吗?

有没有办法让 Ember 开心而不报错???我的 App.Session 模型中确实需要该firstQuestion字段。

打开控制台并查看我的jsfiddle。这是我的问题的一个完美例子。firstQuestion然后尝试在中注释掉App.Session = DS.Model并观察错误如何神奇地消失

4

1 回答 1

8

所以我找到了解决方案。我希望这对将来的人有所帮助!

显然,像我一样将多个关系定义到同一个模型是不合适的,而不是更具描述性......

下面我有两个questionsfirstQuestion指向,App.Question而 Ember 不喜欢我这么模糊!

App.Session = DS.Model.extend({
   "questions" : DS.hasMany('App.Question') ,
   "firstQuestion" : DS.belongsTo('App.Question')
});

为了减少错误传达的机会(并消除烦人的错误),可以将逆关系明确定义如下:

App.Session = DS.Model.extend({
    "questions" : DS.hasMany('App.Question', { inverse: 'session' }),
    "firstQuestion" : DS.belongsTo('App.Question')
});
App.Question = DS.Model.extend({
    "session" : DS.belongsTo('App.Session', { inverse: 'questions' }),
    "choices" : DS.hasMany('App.Choice'),
    "text"    : DS.attr('string')
});

这摆脱了错误。如果其他人有更多的见解甚至批评,我很想听听。

于 2013-07-12T04:27:10.267 回答