我有以下html绑定到包含id和status的对象。我想将状态值转换为特定颜色(因此转换器函数convertStatus)。我可以看到转换器在第一个绑定上工作,但是如果我在绑定列表中更改状态,我看不到任何UI更新,也没有看到随后调用convertStatus。我的另一个问题是尝试绑定第一个span的id属性似乎没有按预期工作(也许不可能通过绑定设置此值...)
HTML:
<span data-win-bind="id: id">person</span>
<span data-win-bind="textContent: status converter.convertStatus"></span>
Javascript(我试过用来修改状态值):
//人=== WinJS.Binding.List
// updateStatus是一个在系统中发生状态变化而调用的函数
function updateStatus(data) {
persons.forEach(function(value, index, array) {
if(value.id === data.id) {
value.status = data.status;
persons.notifyMutated(index);
}
}, this);
}
我已经看到notifyMutated(index)适用于未使用转换器的值。
使用github项目进行更新
Public repo for sample (not-working) - 这是一个非常基本的应用程序,它有一个列表视图,其中包含一组默认数据和一个在单击项目时执行的函数。该函数尝试随机化项目的一个绑定字段,并在列表上调用notifyMutated(...)以触发可视化更新。即使定义了WinJS.Binding.List({binding:true});我没有看到更新,除非我通过notifyReload()强制它,这会在listview元素上产生重载闪烁。
答案 0 :(得分:2)
回答你的两个问题:
1)为什么我不能通过绑定设置id?
这是故意阻止的。 WinJS绑定系统使用ID来跟踪它绑定的元素(以避免通过悬空绑定泄漏DOM元素)。因此,它必须能够控制绑定模板的id。
2)为什么转换器不会多次触发?
Binding.List将告诉listview有关列表内容的更改(添加,删除或移动的项目),但是各个项目有责任通知列表视图其内容的更改。
您需要一个可绑定的数据对象。有几种选择:
WinJS.Binding.as
后者可能更容易。基本上,当您创建Binding.List时,请执行以下操作:
var list = new WinJS.Binding.List({binding: true});
这样List就会在列表中的所有内容上调用binding.as,事情应该开始更新。
答案 1 :(得分:0)
我发现如果我执行以下操作,我会看到UI后绑定的更新:
var list = new WinJS.Binding.List({binding: true});
var item = WinJS.Binding.as({
firstName: "Billy",
lastName: "Bob"
});
list.push(item);
稍后在应用程序中,您可以更改一些值,如下所示:
item.firstName = "Bobby";
item.lastName = "Joe";
...您将看到UI中的更改
以下是MSDN上的链接以获取更多信息: MSDN - WinJS.Binding.as
答案 2 :(得分:0)
关于设置id的值。 我发现我可以为&lt; button&gt;设置name属性的值。 我一直试图设置id,但那不会起作用。 HTH
答案 3 :(得分:0)
optimizeBindingReferences属性
确定绑定是否应自动设置元素的ID。在使用Windows Library for JavaScript(WinJS)绑定的应用程序中,此属性应设置为true。
WinJS.Binding.optimizeBindingReferences = true;
来源:http://msdn.microsoft.com/en-us/library/windows/apps/jj215606.aspx