Диджит HelloWorld (Дубль 4: Передача параметров)

В качестве еще одного усовершенствования нашего диджита Hello World рассмотрим порядок передачи параметров диджиту в его шаблоне. Опираясь на предыдущий пример, предположим, что нам необходимо определить свой текст приветствия для диджита, который определяется в разметке страницы с помощью атрибута dojoType. Делается это просто, как показано ниже:


Передача параметров виджету, создаваемому программным способом, выполняется ничуть не сложнее:
var hw = new dtdg.HelloWorld({greeting : "Hello World"}, theWidgetsDomNode);

Конечно, вы не ограничены только теми свойствами, что упоминаются в шаблоне. Вы можете передавать любые другие параметры, которые могут использоваться разными способами. Взгляните на следующий ниже элемент DIV, содержащий ссылку на диджит HelloWorld, где определяются две дополнительные пары ключ/значение:


Разве это не удобно – иметь возможность передавать диджиту дополнительные данные для использования в процессе инициализации, что позволило бы разработчикам приложений даже не прикасаться к исходному программному коду, а только слегка подправлять шаблон? Итак, дамы и господа, это возможно, и файл с программным кодом JavaScript, как показано в примере 12.5, демонстрирует, как это делается.

Пример 12.5.


HelloWorld (Дубль 4: дополнительные параметры)
dojo.provide("dtdg.HelloWorld");
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.declare(
"dtdg.HelloWorld",
[dijit._Widget, dijit._Templated],
{
templateString : "
Hello World
",
foo : "",
//вы не сможете устанавливать несуществующие свойства диджита
//baz : "",
//атрибуты, указанные в теге с атрибутом dojoType, передаются
//только функции constructor, если предварительно они были
//определены как свойства диджита. То есть наличие
//атрибута baz="quux" не будет оказывать никакого влияния в этом
//примере, потому что диджит не имеет свойства с именем baz
constructor: function() {
console.log("constructor: foo=" , this.foo);
console.log("constructor: baz=" , this.baz);
}
}
);

Возможно, вы уже обратили внимание на тот факт, что вы можете передавать значения только для тех свойств диджита, которые существуют, – невозможно создать новое свойство в диджите, поместив все, что вам заблагорассудится в элемент, содержащий атрибут dojoType.


Если запустить предыдущий пример и проверить результаты в консоли Firebug, вы увидите следующий вывод:
constructor: foo=bar
constructor: baz=undefined

Хотя передача строковых значений диджиту – очень полезная возможность, тем не менее строковые значения имеют ограниченную область применения, потому что жизнь, как правило, не так проста; но и тут не стоит беспокоиться: инструментарий Dojo позволяет также передавать диджитам списки и ассоциативные массивы. Все, что для этого требуется, это определить свойства диджита соответствующего типа в файле JavaScript, а обо всем остальном инструментарий Dojo позаботится сам.

Следующий пример демонстрирует, как передавать списки и ассоциативные массивы в диджиты в шаблоне. Добавление параметров в тег с атрибутом dojoType выполняется очень
просто:
foo="[0,20,40]"
bar="[60,80,100]"
baz="{'a':'b', 'c':'d'}"
dojoType="dtdg.HelloWorld"
>


И изменения в файле JavaScript столь же предсказуемы:
dojo.provide("dtdg.HelloWorld");
dojo.require("dijit._Widget");
dojo.require("dijit._Templated");
dojo.declare(
"dtdg.HelloWorld",
[dijit._Widget, dijit._Templated],
{
templateString : "
Hello World
",
foo : [], //привести значение к типу Array
bar : "", //привести значение к типу String
baz : {}, //привести значение к типу Object
postMixInProperties: function() {
console.log("postMixInProperties: foo[1]=" , this.foo[1]);
console.log("postMixInProperties: bar[1]=" , this.bar[1]);
console.log("postMixInProperties: baz['a']=", this.baz['a']);
}
}
);

Ниже приводится результат работы этого примера, полученный в консоли Firebug:
postMixInProperties: foo[1]=20
postMixInProperties: bar[1]=6
postMixInProperties: baz['a']=b

Обратите внимание на свойство bar: в странице, где используется диджит, это свойство выглядит как список, но в файле JavaScript оно определено как свойство строкового типа.


По этой причине Dojo рассматривает его как строку и при попытке индексирования обращается с ним как со строкой. Вообще парсер пытается интерпретировать значения и преобразовывать их в соответствующие типы, используя возможности грубого определения типа.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Dojo на эту тему:
Анатомия библиотеки Dijit
Быстрое создание прототипов виджетов в разметке
Ваш первый диджит: HelloWorld
Диджит HelloWorld (Дубль 1: Основа)
Диджит HelloWorld (Дубль 2: Изменение шаблона)

Вернуться в раздел: Dojo / Анатомия Dijit и жизненный цикл