У меня время heckuva переходит на Dojo и новую структуру AMD, и я действительно надеюсь, что кто-то может пролить свет на всю концепцию. В течение последних нескольких недель я живу в Google, пытаясь найти информацию об использовании, но тенденции структуры и дизайна в использовании этого.
Мне кажется странным, что для относительно сложного приложения javascript, например, для главной страницы, где необходимо создать и стилизовать Dijits, создать элементы DOM и т.д., которые мне потребуются, и, следовательно, использовать TON разных модули, которые в противном случае были доступны в пространстве имен Dojo до системы AMD (или, по крайней мере, не были назначены 23 различным vars).
Пример:
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
, но если мне это нужно больше одного раза, то вероятность того, что переменная, которую она назначила, выходит за пределы области видимости, d нужно поместить его в вызов domReady!
или ready
. reaalllly....??!
Вот почему я могу только предположить, что я не понимаю, для dojo.
Я действительно посмотрел и обыскал и купил книги (хотя и до 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 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, так и сторонних сайтов, было бы, IMHO, абсолютно смешно загружать все необходимые модули в качестве первого function(ready, parser, style, registy...
будет становиться все длиннее и длиннее и создавать проблемы с коллизиями имен и т.д.
Увольнение и require()
всех модулей, которые мне понадобятся во время жизни script, мне просто кажется глупым. При этом мне придется посмотреть на некоторые сценарии "диспетчера пакетов". Но для этого примера, если бы я хотел использовать модуль запроса в выбранных местах, мне пришлось бы либо загрузить его с остальным в основной оператор require()
. Я понимаю, почему в какой-то степени, но что плохого в родовых точечно-синтаксических пространствах имен? dojo.whatever? dijit.findIt()? Зачем загружать модуль, ссылку в уникальное имя, проходить через закрытие, бла-бла?
Я бы хотел, чтобы это был более простой вопрос, но я надеюсь, что это имеет смысл.
Раздражение
Назовите меня новичком, но это действительно.. на самом деле.. вождение меня с ума. Я не noob, когда дело доходит до 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, потому что я действительно не понимаю, почему это не происходит вместе.
Спасибо, ребята.