4

私は、サブモデルがスーパーモデルとは異なるファイルにある、RequireJSでバックボーンリレーショナルサブモデルを使用する方法を見つけようとしています。

例えば:

// app.js
define(function() {
  var app = {};
  var app.ns = {};
  Backbone.Relational.store.addModelScope(app.ns);
});

// Classroom/Person.js
define(["app", "./Student", "./Professor"], function(app) {
  app.ns.Classroom.Person = Backbone.RelationalModel.extend({
    subModelTypes: {
      'Student': 'Classroom.Student'
      'Professor': 'Classroom.Professor'
    },

    alertHello: function() {}
  });

  return app.ns.Classroom.Person;
});

// Classroom/Student.js
define(["require", "app", "./Person"], function(require, app) {
  app.ns.Classroom.Student = require("./Person").extend({
    alertHello: function() {
      alert("Hello, I am student " + this.get("name"));
    }
  });

  return app.ns.Classroom.Student;
});

// Classroom/PersonCollection.js
define(["app", "./Person"], function (app, Person) {
  app.ns.Classroom.PersonCollection = Backbone.Collection.extend({
    model: Person
  });
});

// alertPeople.js
define(["Classroom/PersonCollection"], function(PersonCollection) {
  var people = PersonCollection([{"name": "Bob", "type": "Person"}]);
  people.each(function(person) {
    person.alertHello();
  });
});

alertPeople.jsを実行すると、「こんにちは、私は学生のボブです」というアラートが表示されますが、代わりにこのエラーが発生Uncaught Error: Module name "Classroom/Person" has not been loaded yet for context: _します。循環依存が原因です。これを回避するための可能な解決策は何ですか?

私の次の問題は、Backbone-relationalの範囲にある可能性があります。app.jsファイルで、スコープの一部にapp.nsを追加し、すべてのモデルがapp.nsオブジェクトで定義されていることを確認します。これを行うと、subModelTypesを定義するときに、実際にサブモデルを参照できますが、循環依存の問題を乗り越えることができないため、これがまだ機能するかどうかはわかりません。

どんな助けでも大歓迎です。ありがとうございました!

4

1 に答える 1

5

私は問題を解決することになりました、そしてこれが将来他の人に役立つことを願っています。

まず、コードを次のように変更しました。

// app.js
define(function() {
  var app = {};
  var app.ns = {};
  Backbone.Relational.store.addModelScope(app.ns);
});

// Classroom/Person.js
define(["app"], function(app) {
  app.ns.Classroom.Person = Backbone.RelationalModel.extend({
    subModelTypes: {
      'Student': 'Classroom.Student'
      'Professor': 'Classroom.Professor'
    },

    alertHello: function() {}
  });

  return app.ns.Classroom.Person;
});

// Classroom/Student.js
define(["app", "./Person"], function(app, Person) {
  app.ns.Classroom.Student = Person.extend({
    alertHello: function() {
      alert("Hello, I am student " + this.get("name"));
    }
  });

  return app.ns.Classroom.Student;
});

// Classroom/PersonCollection.js
define(["app", "./Person", "./Student", "./Professor"], function (app, Person) {
  app.ns.Classroom.PersonCollection = Backbone.Collection.extend({
    model: Person
  });
});

// alertPeople.js
define(["Classroom/PersonCollection"], function(PersonCollection) {
  var people = PersonCollection([{"name": "Bob", "type": "Person"}]);
  people.each(function(person) {
    person.alertHello();
  });
});

私の変更には、Classroom / Person.jsファイル内のStudentとProfessorの依存関係を削除し、それらをClassroom/PersonCollection.jsファイルに移動することが含まれていました。

この後、addModelScopeにサブモデルと名前空間のバグがあるBackbone-relationalのバグに遭遇しましたが、それを修正してプルリクエストを作成しました:https ://github.com/PaulUithol/Backbone-relational/pull/211 、受け入れられました。

より完全な例は、https://github.com/andrewferk/backbone-relational-submodelsにあります。

于 2012-11-07T20:47:21.370 に答える