backbone.js模块定义问题

时间:2012-02-05 10:59:25

标签: javascript module backbone.js

我按照this模式来组织我的js应用程序。

正如该示例所说,我们的应用程序应具有单一入口点。文件application.js正在做这项工作。

// Filename: application.js

var chat = {
  // Create this closure to contain the cached modules
  module: function() {
    // Internal module cache.
    var modules = {};

    // Create a new module reference scaffold or load an
    // existing module.
    return function(name) {
      // If this module has already been created, return it.
      if (modules[name]) {
        return modules[name];
      }

      // Create a module and save it under this name
      return modules[name] = { Views: {} };
    };
  }()
};

// Using the jQuery ready event is excellent for ensuring all 
// code has been downloaded and evaluated and is ready to be 
// initialized. Treat this as your single entry point into the 
// application.
jQuery(function($) {

  $(document).ready(function(){
    var foo = new Application.module('Chat').Collection();
 }); 
});


// Filename: chat-module.js

(function(chat){
  chat.Model = Backbone.Model.extend({ ... }),
  chat.Collection = Backbone.Collection.extend({ ... }),
})(Application.module('Chat'));

看起来不错但是如果尝试定义聊天模块并稍后调用它我会出现以下错误:

Uncaught TypeError: Property 'Collection' of object #<Object> is not a function

我认为当chat-module.js还没有时,jQuery就绪的错误就会调用。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

您的代码会创建一个对象并将其分配给全局变量chat,该变量具有module函数作为属性:

var chat = {
    module: function...
};

...但是当您使用它时,您使用Application.module而不是chat.module

Application.module('Chat')

var foo = new Application.module('Chat').Collection();

在我看来,您的chat变量应该被称为Application

另请注意,您以两种不同的方式使用modulenew和不使用module没有将根据您的代码正确使用。它将以两种方式工作,因为new返回一个函数(它是一个对象),因此它将覆盖正常的new行为,但这意味着使用{{1}}没有任何意义,是误导阅读代码的人。