Теперь я знаю, что этот вопрос задавали миллион раз, но я все еще не мог понять.
У меня огромное количество "определений" в разных файлах. В большинстве случаев это работает, но некоторые из моих модулей "не загружаются для контекста" иногда, несмотря на то, что я указал их имена в операторе "define".
===========================
Текущий код
index.js (упрощенный для StackOverflow)
require.config({
baseUrl: '',
paths: {
//TOOLS
jquery: '../libraries/jquery-1.10.2.min',
socketio:'socket.io/socket.io',
jqueryLightBox:'../libraries/jquery.lightbox_me',
jqueryMigrate:'../libraries/jquery-migrate-1.2.1',
jqueryUI:'../libraries/jquery-ui-1.10.3.custom.min',
spinner:'../libraries/jquery.spin',
jQueryFormPlugin:'../libraries/jquery.form.min',
jQueryCookiePlugin:'../libraries/jquery.cookie',
json2:'../libraries/json2',
raphael:'../libraries/raphael-min',
raphaelPanZoom:'../libraries/raphael.pan-zoom.min',
bootstrap: '../libraries/bootstrap.min',
browserDetection: '../libraries/BrowserDetect',
qtip: '../libraries/jquery.qtip.min',
imagesloaded: '../libraries/imagesloaded.pkgd.min',
eventie: '../libraries/eventie',
eventEmitter: '../libraries/EventEmitter.min',
underscore: '../libraries/underscore-min',
underscoreString: '../libraries/underscore.string.min',
stacktrace: '../libraries/stacktrace',
elapseMeMin: '../libraries/elapseMe.min',
jqueryKeithWood: '../libraries/jquery.svg.min',
domReady: '../libraries/domReady',
//PAGES: (Simplified for StackOverflow)
TestView: '../javascripts/tests/TestView',
TestModel: '../javascripts/tests/TestModel',
TestController: '../javascripts/tests/TestController',
TestPanelView: '../javascripts/tests/Test-StartPanelView',
SocketLogic: '../javascripts/SocketLogic',
Logger: '../javascripts/Logger',
},
shim: {
'socketio': {
exports: 'io'
},
'spinner': {
exports: 'Spinner',
deps: ['jquery']
},
'raphael': {
exports: 'Raphael',
deps: ['jquery']
},
'raphaelPanZoom': {
deps: ['raphael']
},
'bootstrap': {},
'browserDetection': {
exports: 'BrowserDetect'
},
'underscore': {
exports: '_'
},
'underscoreString': {
deps: ['underscore'],
exports: '_'
},
'stacktrace': {
exports: 'printStackTrace'
},
'elapseMeMin': {
exports: 'elapseMe',
deps: ['jquery']
}
}
});
//////////////////
//1) Everything starts with this method. Will execute when the DOM is ready.
/////////////////
require(['domReady'], function (domReady) {
domReady(function () {
//This function is called once the DOM is ready.
//It will be safe to query the DOM and manipulate
//DOM nodes in this function.
//Start Loading!
require(['TestController'], function(TestController)
{
TestController.firstMethod();
});
});
});
TestController.js (упрощено для StackOverflow)
define(['TestModel', 'TestView', 'SocketLogic', 'Logger', 'TestPanelView'],
function (TestModel, TestView, socketLogic, Logger, TestPanelView)
{
return {
firstMethod: function()
{
TestModel.doSomething();
TestView.doSomethingElse();
socketLogic.andAnother();
Logger.log("hi");
TestPanelView.updateSomething();
this.anotherMethod();
},
anotherMethod: function()
{
console.log("hello");
}
}
});
===========================
Проблема
Но время от времени я случайным образом получаю только для одного из них значение "не загружаться из-за контекста", хотя с остальными все в порядке:
Uncaught Error: Module name "TestPanelView" has not been loaded yet for context: _
http://requirejs.org/docs/errors.html#notloaded
===========================
Текущие исправления
Исправление №1 — Использование require('');
Вместо
TestPanelView.updateSomething();
Я занимаюсь:
var testPanelView = require('TestPanelView');
testPanelView.updateSomething();
Что работает, НО… разве оно не должно быть уже загружено в контекст с тех пор, как я поместил его в заголовок? Почему этот? Он такой же, как и все остальные!
Исправление №2 — использование require([''],function(){});
Это тоже работает, но опять же, я просто делаю это один за другим, и это кажется неправильным!
Вместо
TestPanelView.updateSomething();
Иногда я делаю так:
require(['TestPanelView'], function(testPanelView){
testPanelView.updateSomething();
});
Неудачные попытки №1
TestController.js (упрощено для StackOverflow)
define(['require', 'TestModel', 'TestView', 'SocketLogic', 'Logger', 'TestPanelView'],
function (require)
{
var TestModel = require('TestModel')
var TestView = require('TestView');
var SocketLogic = require('SocketLogic');
var Logger = require('Logger');
var TestPanelView = require('TestPanelView');
return {
firstMethod: function()
{
TestModel.doSomething();
TestView.doSomethingElse();
SocketLogic.andAnother();
Logger.log("hi");
TestPanelView.updateSomething();
this.anotherMethod();
},
anotherMethod: function()
{
console.log("hello");
}
}
});
Здесь я снова получаю ошибку "not load for context", но на этот раз для всех из них.
===========================
Идеи?
Я вручную исправлял все, что находил, вот так, что происходит не со всеми, только с некоторыми здесь и там, что похоже на исправление обезьян... хотел бы знать, что я делаю неправильно здесь :( Кто-нибудь знает?
Примечание. Я использую RequireJS v.2.1.10.
var foo = require("...")
(то есть вызовrequire
с одним строковым аргументом) до загрузки требуемого модуля. - person Louis   schedule 30.01.2014require("blah")
в коде, я дважды и трижды проверял все свои файлы :( idk что это такое - person Katie   schedule 30.01.2014