Я запутался в том, как работать с шаблоном модуля (и шаблонами проектирования в целом) в JavaScript.
Я уже написал некоторый функциональный код в своем приложении, используя шаблон модуля, который делает то, что я хочу, но этомне кажется, это не очень модульно, и у меня постоянно возникает ощущение, что я делаю это неправильно.Мне не удалось найти какой-либо конкретный и полный пример приложения с любым шаблоном проектирования.
Вот как я с ним работаю:
Допустим, в моем приложении есть формы, которые я будуиспользовать для разных модулей (публиковать ветки, отвечать на ветки, комментировать гостевую книгу), с некоторым JavaScript, я дам пользователям некоторые функциональные возможности, такие как вывод пузыря смайлика и обработка вставки их в мои формы, отправка сообщений данныхна мой серверный код, чтобы вернуть HTML-код, чтобы добавить сообщение без перезагрузки страницы, я сделаю что-то вроде этого:
let Form = function (selector_form, selector_textarea, selector_emoticonsButton, selector_postButton) {
let form, textarea, emoticonsButton, postButton;
let emoticonsBubble = new EmoticonsBubble()
return {
selectors: function () {
return {
form: function () { return selector_form },
sendButton: function () { return selector_sendButton }
}
}
setElements: function (obj) {
form = $(obj).get(0);
textarea = $(form).find(selector_textarea).get(0);
emoticonsButton = $(form).find(emoticonsButton).get(0);
postButton = $(form).find(selector_postButton).get(0);
emoticonsBubble.setElements(form, emoticonsButton);
},
get: function () {
return {
form: function () { return form },
//...
emoticonsBubble: function () { return emoticonsBubble }
}
},
post: function (moduleId, callback) {
$.ajax({
//parameters
}).done(function (data) {
callback(data);
});
}
}
}
let EmoticonsBubble = function () {
let thisContainerToAppendTo, thisTextarea;
return {
setElements: function (container, textarea) {
thisContainerToAppendTo = container;
thisTextarea = textarea;
},
pop: function () {
this.ajax().pop(function (data) {
$(thisContainerToAppendTo).append(data);
});
}
insert: function (emoticon) {
$(thisTextarea).append(emoticon);
},
ajax: function () {
return {
pop: function (callback) {
$.ajax({
//parameters
}).done(function (data) {
callback(data);
});
}
}
}
}
}
// Events part
let form = new Form('#threadForm', '.textarea', 'button[name="emoticons"]', 'button[name="send"]');
let emoticonsBubble = form.get().emoticonsBubble();
$(form.selectors().form()).on('click', function (e) {
form.setElements(this);
});
$(form.selectors().sendButton()).on('click', function (e) {
let moduleId = // retrieve module id, if it belongs to guests book, thread creation module or reply module
form.post(moduleId, function (data) {
// append data to something
});
});
// etc for emoticons handling
Тот факт, что я должен переписать часть события для каждого другогоФорма, которую я имею в своем приложении, сохраняя все то же самое, но имя переменных, меня раздражает.
Не могли бы вы, ребята, сказать мне, как бы вы справились с этими функциями и что может быть не так с моим способом кодирования?