У меня сейчас невероятный переход на Dojo и новую структуру AMD, и я очень надеюсь, что кто-нибудь сможет пролить свет на всю концепцию.Последние несколько недель я живу в Google, пытаясь найти информацию не о его использовании, а о структуре и тенденциях дизайна в этой области.
Мне кажется странным, что для относительно сложного приложения на javascript, такого как главная страница, где нужно создавать и стилизовать Dijits, создавать элементы DOM и т. Д., Что мне требуется, и поэтому я используюTON различных модулей, которые в противном случае были доступны в пространстве имен dojo до системы AMD (или, по крайней мере, не назначены для 23 различных переменных).
Пример:
require(['dijit/form/ValidationTextBox', 'dijit/form/SimpleTextarea', 'dijit/form/CheckBox', 'dijit/Dialog', 'dijit/form/Form'])
require(['dojo/ready', 'dojo/parser', 'dojo/dom-style', 'dijit/registry', 'dojo/dom', 'dojo/_base/connect', 'dojo/dom-construct'],
function(ready, parser, style, registry, dom, event, construct){
//...etc
}
Это тольконесколько модулей для одной из страниц, над которыми я работаю.Конечно, есть лучший способ доступа к этим методам и т. Д., Я имею в виду, действительно ли мне нужно импортировать совершенно новый модуль для использования byId()
?И еще один, чтобы связать события?Вдобавок ко всему, весь беспорядок, создаваемый необходимостью присвоить имя переменной в списке аргументов функций для привязки, просто кажется таким отступлением.
Я подумал, что вы могли бы require()
модуль только тогда, когданужен, например, модуль query
, но если он понадобится мне более одного раза, скорее всего, переменная, которой он назначен, находится вне области видимости, и мне нужно поместить его в вызов domReady!
или ready
, на самом деле .... ??!
Вот почему я могу только предположить, что это мое непонимание додзё.
Я действительно искал, искал и покупал книги(хотя и до AMD), но эта библиотека действительно дает мне шанс заработать деньги.Я ценю свет, который может пролить каждый.
Редактировать для примера
require(['dijit/form/ValidationTextBox'])
require(['dojo/ready', 'dojo/parser', 'dojo/dom-style', 'dijit/registry', 'dojo/dom', 'dojo/_base/connect', 'dojo/dom-construct'], function(ready, parser, style, registry, dom, event, construct){
/* perform some tasks */
var _name = new dijit.form.ValidationTextBox({
propercase : true,
tooltipPosition : ['above', 'after']
}, 'name')
/*
Let's say I want to use the query module in some places, i.e. here.
*/
require(['dojo/query', 'dojo/dom-attr'], function(query, attr){
query('#list li').forEach(function(li){
// do something with these
})
})
}
Основано на этом формате, который используется во многих примерах из инструментария dojoребятам, а также сторонним сайтам, имхо было бы совершенно нелепо загружать все необходимые модули, так как первые function(ready, parser, style, registy...
становились все длиннее и длиннее, и создавали проблемы с именами коллизий и т. д.
Увольнениеи то, что все модули, которые мне понадобятся при работе со сценарием, мне покажется глупым.При этом мне придется взглянуть на некоторые из сценариев "менеджера пакетов".Но для этого примера, если бы я хотел использовать модуль запроса в выбранных местах, мне пришлось бы либо загрузить его вместе с остальными в главном операторе require()
.Я понимаю, почему в некоторой степени, но что такого плохого в общих пространствах имен с точечным синтаксисом?dojo.whatever?dijit.findIt ()?Зачем загружать модуль, ссылаться на уникальное имя, проходить через закрытие, бла-бла?
Хотелось бы, чтобы это был более простой вопрос, но я надеюсь, что это имеет смысл.
Раздражение
Назовите меня новичком, но это действительно ... действительно ... сводит меня с ума.Я не новичок, когда дело доходит до Javascript (видимо, нет), но ничего себе.Я не могу понять это !
Вот что я собираю.В adder.js:
define('adder', function(require, exports){
exports.addTen = function(x){
return x + 10
}
})
На некоторой главной странице или что-то еще:
require(['./js/cg/adder.js'])
..., которая не соответствует аккуратному формату require(['cg/adder'])
, но как угодно.Сейчас это не важно.
Тогда использование adder
должно быть:
console.log(adder.addTen(100)) // 110
Ближайшее, что я получил, было console.log(adder)
возвращение 3
.Ага.3
.В противном случае, это adder is not defined
.
Почему это должно быть так сложно?Я использую мою карту noob для этого, потому что я действительно понятия не имею, почему это не собирается вместе.
Спасибо, ребята.