2012-02-05 2 views
0

Я следую за this шаблоном для организации приложения js.backbone.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')); 

кажется хорошо, но если попытаться определить модуль чата, например, и вызвать его позже я следующее сообщение об ошибке:

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

ответ

0

Ваш код создает объект и присваивает его глобальной переменной 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 не имеет никакой цели и вводит в заблуждение кого-то, читающего код.

+0

Извините за свою ошибку, мое имя приложения - «чат». У меня есть следующая последовательность загрузки скриптов: 1. application.js 2. chat-module.js. Поэтому jQuery готов к запуску, когда chat-module.js пока недоступен. Но я получаю этот пример из упомянутого выше учебника. – Erik

+0

@ Эрик: Я думаю, вы неправильно поняли мою точку зрения. В 'application.js' вы создаете переменную, называемую' chat', а не 'Application'. Если вы измените 'var chat = ...' на 'var Application = ...', это может устранить вашу проблему. –

Смежные вопросы