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 で 'session' 関係を定義しましたが、App.Session でタイプ App.Question の可能性のある逆関係が複数見つかりました。

App.Sessionこれは、内部に を参照する 2 つのフィールドがあるためであることがわかりましたApp.Question

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

しかし、なぜEmberは私が複数のApp.Question関係を持っていることを気にかけているのだろうか?? 特に、エラーがスローされるのに、完全に機能する理由。これはおそらくバグですか?

エラーをスローせずに Ember を満足させる方法はありますか? firstQuestionApp.Session モデルでそのフィールドが本当に必要です。

コンソールを開いて、私のjsfiddleを見てください。それは私の問題の完璧な例です。firstQuestion次に、でコメントアウトしてみてApp.Session = DS.Model、エラーが魔法のように消えるのを見てください

4

1 に答える 1

8

だから私は解決策を見つけました。これが将来誰かに役立つことを願っています!

私が行ったように、同じモデルに複数の関係を定義するのは明らかに不適切でした。もう少し説明的ではありません...

以下に私は両方を持っておりquestionsfirstQuestionエンバーApp.Questionは私がとても漠然としていたのが好きではありませんでした!

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 に答える