data-win-bind问题:转换器只运行一次,无法绑定元素的id

时间:2012-08-17 18:51:28

标签: javascript microsoft-metro winjs

我有以下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元素上产生重载闪烁。

4 个答案:

答案 0 :(得分:2)

回答你的两个问题:

1)为什么我不能通过绑定设置id?

这是故意阻止的。 WinJS绑定系统使用ID来跟踪它绑定的元素(以避免通过悬空绑定泄漏DOM元素)。因此,它必须能够控制绑定模板的id。

2)为什么转换器不会多次触发?

Binding.List将告诉listview有关列表内容的更改(添加,删除或移动的项目),但是各个项目有责任通知列表视图其内容的更改。

您需要一个可绑定的数据对象。有几种选择:

  • 在将元素添加到集合
  • 时调用元素WinJS.Binding.as
  • 打开Binding.List
  • 上的绑定模式

后者可能更容易。基本上,当您创建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