Привязка данных WinJS: классы и привязка событий

Во-первых, есть ли список свойств, которые можно установить при использовании атрибута data-win-bind в вашей разметке?

Несколько вещей, которые я хочу сделать:

  1. Условно добавьте имя класса на основе источника данных.
  2. Объявите прослушиватели событий в разметке. Хотелось бы, чтобы эти прослушиватели событий существовали в источнике данных, а НЕ в какой-либо глобальной функции.

person pbo    schedule 11.06.2012    source источник


Ответы (2)


Есть два набора свойств, к которым вы можете привязаться.

Во-первых, это свойства, поддерживаемые в DOM каждым типом элемента. Так, например, для элемента img вы можете привязать свойство src, чтобы установить отображаемое изображение. Для элемента input вы можете привязать к свойству value. Полный список элементов HTML, доступных для приложений Metro, можно просмотреть здесь.

Второй набор свойств доступен, если вы применили элемент управления пользовательского интерфейса WinJS к элементу (что обычно делается с помощью атрибута data-win-control. Вы можете установить свойства, определенные каждым элементом управления, с помощью свойства winControl, которое добавляется при применении элемента управления. Например, если вы хотите привязать свойство itemTemplate к ListView, у вас будет такая разметка:

<div id="list" data-win-control="WinJS.UI.ListView"
    data-win-bind="winControl.itemTemplate: myValue"></div>

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

var dataSource = {
    myClickHandler: function (e) { console.log("Click!") }
}

А затем привязать к свойству on*, которое соответствует интересующему вас событию:

<button data-win-bind="onclick: myClickHandler">Press Me</button>

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

var dataSource = {
    myClickHandler: function (e) { console.log("Click") },
    classes: WinJS.Binding.as({
        myFirstClass: true,
        mySecondClass: false,
    })
}

А затем используйте метод привязки для наблюдаемого объекта, чтобы получать уведомления об изменении значения и применять/удалять класс следующим образом:

dataSource.classes.bind("myFirstClass", function (newValue) {
    var elem = document.getElementById("myId");
    if (newValue) {
        WinJS.Utilities.addClass(elem, "myFirstClass");
    } else {
        WinJS.Utilities.removeClass(elem, "myFirstClass");
    }
});

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

person Adam Freeman    schedule 12.06.2012

Вы можете установить любое свойство javascript для элементов через привязку данных. Таким образом, можно установить все, что представлено как свойство javascript (в основном, все, кроме атрибутов aria-).

Добавление имени класса немного сложнее, так как вы можете установить свойство className, но не добавлять к нему с помощью привязки. Однако вы можете включить все имена классов в одну строку.

У нас есть код, который постоянно устанавливает, например, атрибуты onclick. Включите функцию как часть источника данных, и все готово.

person Chris Tavares    schedule 11.06.2012