Я бы хотел перенести код javascript со своей страницы на YUI3. Прочитав много постов (вопросов и ответов) здесь и много информации на странице YUI3 и в учебниках, я пришел к выводу, что лучший способ сделать это - разделить код на модули, потому что это позволяет мне динамически загружать скрипты только при необходимости.
Я хотел бы организовать код в разных подмодулях, которые должны загружаться и управляться (если необходимо) модулем ядра.
Мне кажется, я понял, как динамически загружать их, но проблема, с которой я столкнулся сейчас, заключается в том, что я не всегда могу вызывать публичные методы как внутри модуля, так и формировать один модуль в другой. Иногда это работает, но иногда я получаю сообщение xxx is not a function
.
Вероятно, вопрос в том, что я не понимаю, как установить глобальное пространство имен (например, MyApp
) и "играть" в этом пространстве имен.
Я хотел бы иметь возможность вызывать методы следующим образом: MyApp.Tabs.detectTabs()
... как из методов основного модуля (MyApp.Core
), так и из одного и того же подмодуля (MyApp.Tabs
).
Вот структура моего кода:
Встроенный JavaScript:
var MyAppConfig = {
"tabpanels":{"ids":["navigation"]},
"events": [{"ids": ["main_login", "dictionary_login"],
"type": "click",
"callback": "MyApp.Core.updateContent",
"params":{
}
}]
};
YUI_config = {
filter: 'debug',
groups: {
'myapp': {
modules: {
'project-myapp-core': {
fullpath: 'http://www.myapp.com/scripts/Core.js',
requires: ['node-base']
},
'project-myapp-tabs': {
fullpath: 'http://www.myapp.com/scripts/Tabs.js',
requires: ['base', 'project-myapp-core', 'history', 'tabview', 'tabview-base']
}
}
}
}
};
YUI(YUI_config).use('node', 'base', 'project-myapp-core', function(Y) {
var MyApp = {};
MyApp.Core = new Y.MyApp.Core();
Y.on('domready', MyApp.Core.begin, Y, null, application);
});
Модуль: Core
Файл: http://www.myapp.com/scripts/Core.js
YUI.add('project-myapp-core', function(Y) {
function Core(config) {
Core.superclass.constructor.apply(this, arguments);
}
Core.NAME = 'myapp-core';
Core.ATTRS = {};
var MyApp;
MyApp = {};
Y.extend(Core, Y.Base, {
initializer: function (cfg) {
},
begin: function(e, MyAppConfig) {
MyApp.Core = instance = this;
if (MyAppConfig.tabpanels) {
YUI().use('node', 'project-myapp-tabs', function(Y) {
MyApp.Tabs = new Y.MyApp.Tabs();
});
}
if (MyAppConfig.events) {
MyApp.Core.prepareEvents(MyAppConfig.events);
// I get "MyApp.Core.prepareEvents is not a function"
}
},
prepareEvents: function(e) {
},
updateContent: function() {
}
});
Y.namespace('MyApp');
Y.MyApp.Core = Core;
}, '0.0.1', { requires: ['node-base'] });
Подмодуль: Tabs
Файл: http://www.myapp.com/scripts/Tabs.js
YUI.add('project-myapp-tabs', function(Y) {
function Tabs(config) {
Tabs.superclass.constructor.apply(this, arguments);
}
Tabs.NAME = 'myapp-tabs';
Tabs.ATTRS = {};
var tabView = [];
Y.extend(Tabs, Y.Base, {
initializer: function (cfg) {
},
begin: function (tabpanels) {
},
methodA: function () {
}
});
Y.namespace('MyApp');
Y.MyApp.Tabs = Tabs;
}, '0.0.1', { requires: ['base', 'project-myapp-core', 'history', 'tabview', 'tabview-base'] });
Где я должен определить глобальные переменные, пространство имен ...? Как мне вызвать функции?
Заранее спасибо!
- Ориол -