1

依存関係の一部がrequire JSを介してロードされたバックボーンモデルがあります。Require.js の循環依存の問題を回避するために、この方法で処理しています。(モデル、コレクション、およびビューを必要とする複数のファイルがあり、それらのいくつかは循環しています。)

問題は、モデルに設定された属性 ( this) がundefined、require ステートメントの外に出てくることです。コードはここにあります:

define(["jquery", "backbone"],
function($, Backbone) {
    var Model = Backbone.Model.extend({

        initialize: function(options) {
            var that = this;
            require(["collections/agenciesCollection", "collections/usersCollection", "models/userModel"], function(Agencies, Users, User) {
                that.agencies = (!options || !options.agencies) ? new Agencies() : new Agencies(options.agencies);
                that.users = (!options || options.users) ? new Users() : new Users(options.users); 
                if(!options || !options.contact) that.set("contact", new User()); else that.set("contact", new User(options.contact));
                if(!options || !options.admin) that.set("admin", new User()); else that.set("admin", new User(options.contact));
                console.log(that.agencies); // This is set to a collection
            });
            console.log(this.agencies); // This is 'undefined'
            console.log(this); // This has an attribute "agencies" listed in Chrome inspector
        }
  return Model;
});
4

1 に答える 1

3

コンストラクターで非同期require呼び出しを使用しているため、値をコンソールに記録しようとするまでにプロパティが定義されていません。

これらの行:

console.log(this.agencies); // This is 'undefined'
console.log(this); // This has an attribute "agencies" listed in Chrome inspector

この前に実行されています:

console.log(that.agencies); // This is set to a collection

アップデート

最後のコメントに基づいて、モジュール定義の依存関係リストを簡素化する方法の例を挙げたいと思います。次のように依存関係を要求してみてください。

define(function (require) {
  var $ = require("jquery");
      backbone = require("backbone");
      agencies = require("collections/agenciesCollection");
      users = require("collections/usersCollection");
      userModel = require("models/userModel");

  // TODO: define your exports using the required dependencies
});

これは、依存関係をロードするさまざまな方法の説明にも役立つ場合があります

于 2013-05-15T17:45:09.687 に答える