В последнее время я участвовал в нескольких проектах Windows 8. Один из вопросов, которые мне периодически задавали, был о том, как написать собственный пользовательский элемент управления приложениями Магазина Windows с библиотекой WinJS. В этом посте мы попытаемся дать вам старт для вашей библиотеки пользовательских элементов управления. Во время публикации вы шаг за шагом создадите элемент управления автозаполнением и узнаете несколько концепций WinJS. Итак, начнем.
Объект WinJS.Namespace
Первое, что нужно сделать, когда вы пишете свои собственные элементы управления, это поместить их в свое собственное пространство имен. Пространства имен помогают сгруппировать набор идентификаторов в логическую группу. Эти идентификаторы могут быть классами, функциями или любыми другими структурами языка разработки, которые вы хотите сгруппировать в пространстве имен. Для получения более подробной информации о пространствах имен JavaScript перейдите по следующей ссылке .
WinJS включает в себя объект пространства имен, который может помочь вам определить пространства имен. Вы будете использовать функцию WinJS.Namespace.define, которая получает два параметра: имя пространства имен и объект, заполненный идентификаторами пространства имен. В следующем примере определяется новое пространство имен MyApp.UI :
WinJS.Namespace.define("MyApp.UI", { // identifiers });
Объект WinJS.Namespace также включает функцию defineWithParent для определения иерархий пространства имен, но в этом примере я не использую его.
Определение класса управления
Итак, теперь у нас есть пространство имен, что дальше? создание класса управления.
Поскольку JavaScript не включает концепцию класса, вы можете имитировать это поведение, используя функции конструктора и прототипное наследование. К счастью, WinJS включает в себя объект Class, который предоставляет функции для определения, извлечения или смешивания JavaScript-классов.
Чтобы определить класс, вы будете использовать функцию WinJS.Class.define . Функция получает три параметра: функцию конструктора для инициализации объектов, объект-члены экземпляра, который нужно добавить к каждому созданному экземпляру, и объект-член static, который будет добавлен к прототипу класса. Давайте определим класс Autocomplete внутри ранее созданного пространства имен:
WinJS.Namespace.define("MyApp.UI", { Autocomplete: WinJS.Class.define(function (element, options) { // constructor function body }, { // instance members }, { // static members }); });
Как видите, функция define получает все три параметра. В функции конструктора вы получите два параметра, которые являются элементом для элемента управления и объектом параметров для настройки элемента управления. Эти два параметра являются обязательными для создания элемента управления WinJS, поскольку они сопоставляются атрибутам HTML data-win-control и data-win-options элемента при вызове функции processAll .
Добавление функции управления
Теперь, когда у нас есть шаблон для класса управления, давайте создадим его функциональность. Прежде чем писать какой-либо код, давайте разберемся, что мы ожидаем от элемента управления. Элемент управления должен создать элемент списка данных на лету и прикрепить его к типу ввода (если вы хотите прочитать о новом элементе списка данных HTML5 , вы можете перейти по следующей ссылке ). Элемент управления также должен получить в качестве входных данных список параметров, который будет отображаться в виде списка автозаполнения. Итак, давайте напишем код:
(function (WinJS) { WinJS.Namespace.define("MyApp.UI", { Autocomplete: WinJS.Class.define(function (element, options) { if (!element || element.tagName.toLowerCase() !== "input") throw "input type must be provided"; options = options || {}; this._setElement(element); this._setOptionList(options.optionList); this._element.winControl = this; WinJS.UI.setOptions(this, options); this._createDataList(); }, { //Private members _element: null, _optionList: null, _setElement: function (element) { this._element = element; }, _setOptionList: function (optionList) { optionList = optionList || []; this._optionList = optionList; }, _createDataList: function () { var i = 0, len = this._optionList.length, dl = document.createElement('datalist'); dl.id = 'dl' + this._element.id; this._element.setAttribute("list", dl.id); for (; i < len; i += 1) { var option = document.createElement('option'); option.value = this._optionList[i]; dl.appendChild(option); } document.body.appendChild(dl); }, //Public members element: { get: function () { return this._element; } } }) }); }(WinJS));
Как вы можете видеть, функция конструктора сначала проверяет, является ли элемент типом ввода. Он также устанавливает элемент и список опций, которые должны быть предоставлены в объекте опций. Последнее, что он делает, это создает элемент списка данных . В экземпляре объекта-члена вы разделяете функции и свойства на частный и публичный раздел-член. Это разделение является только логическим (и отмечено комментариями), и, как вы можете видеть, частные члены получают знак подчеркивания перед своим именем. Основная функциональность здесь является _createDataList функцией обработки создания DataList и устанавливает атрибут списка ввода типа в списке идентификаторы. Все остальные функции просты.
Использование элемента управления
Теперь, когда у нас есть контроль, давайте его использовать. В примере приложения я добавил файл data.js в папку js и написал в нем следующий код:
(function () { "use strict"; WinJS.Namespace.define("Data", { cities: ["Seattle", "Las Vegas", "New York", "Salt lake City"] }); })();
Я мог получить любые данные из любого другого источника (облако, сервис, хранилище), но я хотел, чтобы пример был простым.
В файле home.html, расположенном в папке pages / home, я добавил тип ввода текста, который настраивается с помощью атрибутов data-win-control и data-win-options :
<input type="text" name="txtCities" id="txtCities" data-win-control="WinJS.UI.Autocomplete" data-win-options="{ optionList: Data.cities }"/>
Не забудьте добавить теги сценария для файла autocomplete.js и файла data.js, чтобы пример работал.
Теперь все настроено, и вы можете запустить приложение и увидеть результат:
Полный пример можно скачать здесь .
Резюме
WinJS поставляется с множеством встроенных элементов управления, таких как FlipView, ListView ToggleSwitch и многие другие. С другой стороны, иногда необходимо создать свои собственные элементы управления. В этом посте вы узнали основы создания собственного пользовательского элемента управления WinJS.