javascript - WinJS 数据绑定(bind) : Classes and Event Binding

标签 javascript data-binding winjs

首先,在您的标记中使用 data-win-bind 属性时,是否有任何可以设置的属性列表?

我想做的几件事:

  1. 根据数据源有条件地附加一个类名。
  2. 在标记中声明事件监听器。希望这些事件监听器存在于数据源上,而不是某些全局函数。

最佳答案

您可以绑定(bind)两组属性。

首先是每个元素类型在 DOM 中支持的属性。因此,例如,对于 img 元素,您可以绑定(bind) src 属性来设置显示的图像。对于 input 元素,您可以绑定(bind)到 value 属性。您可以查看可用于 Metro 应用程序的 HTML 元素的完整列表 here .

如果您已将 WinJS UI 控件应用到元素(通常使用 data-win-control 属性完成),则可以使用第二组属性。您可以设置每个元素定义的属性通过在应用控件时添加的 winControl 属性进行控制。例如,如果您想在 ListView 中绑定(bind) itemTemplate 属性,你会有这样的标记:

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

您可以使用相同的技术来设置您的事件处理程序。像这样将回调函数定义为数据源的一部分:

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

然后绑定(bind)到你感兴趣的事件对应的on*属性:

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

添加和删除单个类要复杂得多。我发现最简单的方法是使用基于代码的绑定(bind)。在您的数据源中创建一个可观察的属性,如下所示:

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

然后在observable对象上使用bind方法在值改变时获取通知并应用/删除类,如下:

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

可以以声明方式绑定(bind)类,但您需要一次性设置所有类,这很少有用。如果您想采用这种方法,则可以在元素上绑定(bind) className 属性。

关于javascript - WinJS 数据绑定(bind) : Classes and Event Binding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10982091/

相关文章:

windows-8 - 从使用 WinJS 读取的文件返回值以在页面中使用

javascript - 按优先选择排序的更高效的方式

c# - 如何在单独的线程上运行 Converter 内的代码,以便 UI 不卡住?

javascript - 数据绑定(bind)的 secret 是什么?

windows-runtime - 与 Windows 应用商店应用程序的本地网络 p2p 连接

windows-runtime - 如何打包 Windows 运行时组件以进行分发?

javascript - 我的所有模板都在 $templateCache 中,但 Angular 仍然在发出请求

javascript - 按坐标绘制大厅平面图

javascript - 使页面高度为浏览器的 100%

c# - WPF GridView 列绑定(bind)问题