【问题标题】:Backbone & Require: model property set in require block not "sticking" out of the block骨干和要求:在要求块中设置的模型属性不会“伸出”块外
【发布时间】:2013-05-15 17:17:47
【问题描述】:

我有一个 Backbone 模型,它的一些依赖项通过 require JS 加载。我正在以这种方式处理它以解决 Require.js 的循环依赖问题。 (我们有多个文件需要模型、集合和视图,其中一些是循环的。)

问题在于模型上设置的属性 (this) 在 require 语句之外以 undefined 的形式出现。代码在这里:

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;
});

【问题讨论】:

    标签: backbone.js requirejs


    【解决方案1】:

    您在构造函数中使用异步 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
    });
    

    这也可能有助于解释加载依赖项的不同方式:https://github.com/jrburke/requirejs/wiki/Differences-between-the-simplified-CommonJS-wrapper-and-standard-AMD-define

    【讨论】:

    • 是的,这似乎是问题所在。我最终使用了一种解决方法来尝试解决它。​​
    • 我建议您将 "collections/agenciesCollection", "collections/usersCollection", "models/userModel" 包含在您的 define 依赖项列表中。根据您发布的代码,没有明显的理由在构造函数中调用 require
    • define 依赖项列表只是此文件中加载内容的一小部分。它很长,因此将其全部分解。
    猜你喜欢
    • 1970-01-01
    • 2017-02-04
    • 2012-12-02
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    相关资源
    最近更新 更多