backbone.js Проблема с определением модуля - PullRequest
0 голосов
/ 05 февраля 2012

Я следую этому шаблону, чтобы организовать мое приложение 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

Я думаю, что ошибка из-за готовности jQuery вызывается, когда chat-module.js еще не доступен. Как я могу решить эту проблему?

1 Ответ

0 голосов
/ 05 февраля 2012

Ваш код создает объект и присваивает его глобальной переменной chat, которая имеет свойство module в качестве свойства:

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

... но затем, когда вы его используете, выиспользуйте Application.module вместо chat.module.

Application.module('Chat')

и

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

Мне кажется, что ваша переменная chat должна называться Application.

Также обратите внимание, что вы используете module двумя различными способами, как с new, так и без него. Без будет правильным использованием на основе вашего кода.Он будет работать в обоих направлениях, потому что module возвращает функцию (которая является объектом) и, таким образом, отменяет нормальное поведение new, но это означает, что использование new не имеет смысла и вводит в заблуждение того, кто читает код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...