Поделиться через


Использование шаблонов для привязки данных (HTML)

[ Эта статья адресована разработчикам приложений среды выполнения Windows для Windows 8.x и Windows Phone 8.x. При разработке приложений для Windows 10 см. раздел последняя документация]

Шаблоны библиотеки Windows для JavaScript — это удобный способ форматирования и отображения нескольких экземпляров данных. Вы можете использовать эти шаблоны в сочетании с объектами ListView и FlipView, чтобы указать необходимый способ их отображения. Кроме того, вы можете использовать шаблон для привязки нескольких экземпляров объекта данных, не используя встроенное представление. Дополнительные сведения об использовании шаблона с элементом ListView см. в разделе Краткое руководство: добавление элемента ListView. Дополнительные сведения об использовании шаблона с элементом FlipView см. в разделе Добавление элементов управления FlipView. Следующая процедура демонстрирует использование шаблона с массивом.

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

Необходимые условия

Инструкции

Этап 1: Настройка проекта для использования шаблона

Чтобы настроить проект, в котором будет использоваться шаблон, выполните следующие шаги.

Hh700356.wedge(ru-ru,WIN.10).gif

  1. Создайте пустое приложение Магазина Windows на JavaScript и назовите его TemplateExample.

  2. В элемент BODY файла default.html добавьте элемент DIV для шаблона и присвойте ему идентификатор templateDiv, а затем добавьте атрибут data-win-control со значением "WinJS.Binding.Template", как показано в данном разделе.

    <body>
        <div id="templateDiv" data-win-control="WinJS.Binding.Template"></div> 
    </body>
    

    Мы также добавим внутреннюю структуру шаблона после определения объекта данных.

Этап 2: Определение объекта данных и его привязка к полям шаблона

  1. В файле default.js в пределах немедленно вызываемой функции объявите объект, содержащий несколько полей. В этом случае мы используем метод WinJS.Binding.define, который позволяет привязывать любые свойства.

    
    (function () {
        "use strict";
    
        // Other app code ...
    
        // Define a Person object with bindable properties.
        var Person = WinJS.Binding.define({
            name: "",
            color: "",
            birthday: "",
            petname: "",
            dessert: ""
        });
    
    })();
    
  2. Чтобы отобразить поля этого объекта в шаблоне, понадобится список, элементы которого соответствуют полям объекта данных, как показано здесь. Добавьте следующий код в пределах тегов BODY в файле default.html.

    <div id="templateDiv" data-win-control="WinJS.Binding.Template">
        <div class="templateItem" data-win-bind="style.background: color">
            <ol>
                <li><span>Name :</span><span data-win-bind="textContent: name"></span></li>
                <li><span>Birthday:</span><span data-win-bind="textContent: birthday"></span></li>
                <li><span>Pet's name: </span><span data-win-bind="textContent: petname"></span></li>
                <li><span>Dessert: </span><span data-win-bind="textContent: dessert"></span></li>
            </ol>
        </div>
    </div>
    
  3. Под кодом шаблона в файле default.html добавьте элемент DIV, в котором должен отображаться шаблон.

    <div id="templateControlRenderTarget"></div>
    

Этап 3: Управление количеством отображенных объектов

Для этого примера мы создадим три объекта Person и добавим раскрывающийся список, чтобы пользователь мог выбрать количество объектов Person, которые следует отобразить.

  1. Добавьте следующий код в пределах тегов BODY в файлах default.html.

    <fieldset id="templateControlObject">
        <legend>Pick a name:</legend>
        <select id="templateControlObjectSelector">
            <option value="0">Show one</option>
            <option value="1">Show two</option>
            <option value="2">Show three</option>
        </select>
    </fieldset>
    
  2. В файле default.js в пределах немедленно вызываемой анонимной функции создайте массив из трех объектов Person.

    
    (function () {
        "use strict";
    
        // Other app code ...
    
        // Define a Person 'class' with bindable properties.
        var Person = WinJS.Binding.define({
            name: "",
            color: "",
            birthday: "",
            petname: "",
            dessert: ""
        });
    
        // Declare an array of People objects.
        var people = [
            new Person({name:"Bob", color:"red", birthday:"2/2/2002", petname:"Spot", dessert:"chocolate cake"}),
            new Person({name:"Sally", color:"green", birthday:"3/3/2003", petname:"Xena", dessert:"cherry pie"}),
            new Person({name:"Fred", color:"blue", birthday:"2/2/2002", petname:"Pablo", dessert:"ice cream"}),
        ];
    
    })();
    
  3. 3. Теперь добавьте прослушиватель для события изменения селектора раскрывающегося списка. Добавьте следующий код в обработчик события app.onactivated в файле default.js.

    app.onactivated = function (args) {
    
        // Other activation code ...
    
        var selector = document.querySelector("#templateControlObjectSelector");
              selector.addEventListener("change", handleChange, false); 
    
    }
    

В обработчике событий изменений выберите элемент DIV, содержащий шаблон, и элемент DIV, указывающий место отображения данных, а затем вызовите метод render для элемента управления шаблона (который вы можете получить из свойства wincontrol элемента templateDiv). При вызове метода render для шаблона соответствующие поля объекта данных привязываются к элементам списка шаблона

function handleChange(evt) {
    var templateElement = document.querySelector("#templateDiv");
    var renderElement = document.querySelector("#templateControlRenderTarget");
    renderElement.innerHTML = "";

    var selected = evt.target.selectedIndex;
    var templateControl = templateElement.winControl;

    while (selected >= 0) {
        templateElement.winControl.render(people[selected--], renderElement); 
    } 
}

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

Этап 4: Добавление DIV методом render

Функции render не обязательно передавать созданный вами DIV; render создает новый DIV, если он не указан. Однако вы должны добавить новый DIV в модель DOM. Обратите внимание, что возвращаемым значением для render является WinJS.Promise. (Дополнительные сведения об условиях см. в разделе Краткое руководство: использование объектов отложенного результата.) В метод done отложенного результата добавьте функцию, которая добавляет новый DIV.

Измените блок while предыдущего этапа, как показано ниже.


    while (selected >= 0) {
        templateElement.winControl.render(people[selected--])
            .done(function (result) {
                 renderElement.appendChild(result);
            });        
    }

Замечания

Здесь приведен полный листинг кода из данного раздела.

default.html (Windows)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>TemplateExample</title>

    <!-- WinJS references -->
    <link href="//Microsoft.WinJS.2.0/css/ui-dark.css" rel="stylesheet" />
    <script src="//Microsoft.WinJS.2.0/js/base.js"></script>
    <script src="//Microsoft.WinJS.2.0/js/ui.js"></script>

    <!-- TemplateExample references -->
    <link href="/css/default.css" rel="stylesheet" />
    <script src="/js/default.js"></script>
</head>
<body>
    <div id="templateDiv" data-win-control="WinJS.Binding.Template">
        <div class="templateItem" data-win-bind="style.background: color">
            <ol>
                <li>Name: <span data-win-bind="textContent: name"></span></li>
                <li>Birthday: <span data-win-bind="textContent: birthday"></span></li>
                <li>Pet's name: <span data-win-bind="textContent: petname"></span></li>
                <li>Dessert: <span data-win-bind="textContent: dessert"></span></li>
            </ol>
        </div>
    </div>
    <div id="templateControlRenderTarget"></div>
    <fieldset id="templateControlObject">
        <legend>Pick a name:</legend>
        <select id="templateControlObjectSelector">
            <option value="0">Show one</option>
            <option value="1">Show two</option>
            <option value="2">Show three</option>
        </select>
    </fieldset>
</body>
</html>

default.html (Windows Phone)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>TemplateBinding</title>

    <!-- WinJS references -->
    <link href="/css/ui-themed.css" rel="stylesheet" />
    <script src="//Microsoft.Phone.WinJS.2.1/js/base.js"></script>
    <script src="//Microsoft.Phone.WinJS.2.1/js/ui.js"></script>

    <!-- TemplateBinding references -->
    <link href="/css/default.css" rel="stylesheet" />
    <script src="/js/default.js"></script>
</head>
<body>
    <div id="templateDiv" data-win-control="WinJS.Binding.Template">
        <div class="templateItem" data-win-bind="style.background: color">
            <ol>
                <li>Name: <span data-win-bind="textContent: name"></span></li>
                <li>Birthday: <span data-win-bind="textContent: birthday"></span></li>
                <li>Pet's name: <span data-win-bind="textContent: petname"></span></li>
                <li>Dessert: <span data-win-bind="textContent: dessert"></span></li>
            </ol>
        </div>
    </div>
    <div id="templateControlRenderTarget"></div>
    <fieldset id="templateControlObject">
        <legend>Pick a name:</legend>
        <select id="templateControlObjectSelector">
            <option value="0">Show one</option>
            <option value="1">Show two</option>
            <option value="2">Show three</option>
        </select>
    </fieldset>
</body>
</html>

default.js (Windows и Windows Phone)


(function () {
    "use strict";

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;

    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {
            if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {

            } else {

            }
       
            // Add event handler to selector. 
            var selector = document.querySelector("#templateControlObjectSelector");
            selector.addEventListener("change", handleChange, false);

            args.setPromise(WinJS.UI.processAll());

        }
    };

    app.start();

    // Define a Person 'class' with bindable properties.
    var Person = WinJS.Binding.define({
        name: "",
        color: "",
        birthday: "",
        petname: "",
        dessert: ""
    });

    // Declare an array of People objects.
    var people = [
        new Person({ name: "Bob", color: "red", birthday: "2/2/2002", petname: "Spot", dessert: "chocolate cake" }),
        new Person({ name: "Sally", color: "green", birthday: "3/3/2003", petname: "Xena", dessert: "cherry pie" }),
        new Person({ name: "Fred", color: "blue", birthday: "2/2/2002", petname: "Pablo", dessert: "ice cream" }),
    ];

    // Update the displayed data when the selector changes.
    function handleChange(evt) {
        var templateElement = document.querySelector("#templateDiv");
        var renderElement = document.querySelector("#templateControlRenderTarget");
        renderElement.innerHTML = "";

        var selected = evt.target.selectedIndex;
        var templateControl = templateElement.winControl;

        while (selected >= 0) {
            templateElement.winControl.render(people[selected--])
                .done(function (result) {
                    renderElement.appendChild(result);
                });        
        }
    }
})();

Связанные разделы

Краткое руководство: добавление элемента управления ListView

Добавление элементов управления FlipView