在Splice上更新WinJS.Binding.List

时间:2014-01-01 09:30:04

标签: javascript windows-8 winjs windows-8.1

我正在使用Javascript和winJS框架构建类似于Windows 8的网格应用程序模板的应用程序。对于我的一个页面,我的许多项目具有相同的值,并且使用.createFiltered为每个不同的值返回了1个项目。这非常适合添加新项目,因为.createFiltered方法会更新并检查我的新项目是否具有新值。

我遇到的问题是删除项目。当我拼接WinJS列表时,有可能删除了.createFiltered方法为重复值返回的项目,但是还有其他项目与该值有关。所以我需要再次运行.createFiltered,然后选择一个不同的项目。

我会举个例子。

我有5个项目,其中有两种类型的“Apple”和“banana”。

在我的主页上,我将物品分类为水果/蔬菜/糖果。这五个项目都在水果之下,但不是给出不同的品牌,我只想让它说“Apple”和“Banana”所以我有一个函数,它将为每种类型获得一个项目并将其绑定到WinJS.Binding.Template然后使用“textContent:Type”显示Apple / Banana。

假设我有2个苹果“Gala”和“Granny Smith”,我已将“Gala”的数据绑定到主页,然后我用完了“Gala”苹果(删除它)。我仍然有苹果库存(格兰尼史密斯)所以我需要.createFiltered函数再次运行,因为主页不再在Fruit下显示“苹果”。

谢谢

1 个答案:

答案 0 :(得分:0)

自写这篇文章以来,我设法找到一种方法让它发挥作用。我所做的是找到我正在删除的项目的值,然后通过数组查看是否可以找到具有该值的其他项目。然后我从列表中删除了它,然后重新添加它,导致.createFiltered处理该项目。

确切代码:

function dashRefresh(toDelete) {
    //Project Key of Deleted Item
    var deletedProjectKey = toDelete.data.project.key;
    //Use new item to bind project data
    var newProjectBinder = 0;
    var newProjectBinderIndex;

    for (var i = 0; i < list.length; i++) {
        var listItem = list.getAt(i);
        if (listItem.project.key == deletedProjectKey) {
            newProjectBinder = listItem;
            newProjectBinderIndex = i;
            i = list.length;
        }
    }

    if (newProjectBinder != 0) {
        list.splice(newProjectBinderIndex, 1);
        list.push(newProjectBinder);
    }
}