Concat将两个WinJS.Binding.List合并为一个

时间:2013-03-26 03:34:36

标签: javascript windows-8 windows-store-apps winjs

我正在尝试将2 WinJS.Binding.List合并为一个。我在MSDN上看到了.concat方法,但它似乎不起作用。有人可以告诉我该怎么做吗?

输入:

var a = new WinJS.Binding.List([1,2])
var b = new WinJS.Binding.List([3,4])

预期输出:WinJS.Binding.List,其中包含数字1,2,3,4。

我尝试a.concat(b),但它返回一个3元素数组而不是WinJS.Binding.List。这是控制台中的日志。

var a = new WinJS.Binding.List([1,2])
var b = new WinJS.Binding.List([3,4])
a.concat(b)
==> [object Array][...]

任何想法为什么以及如何正确地做到这一点?

P.S。我知道我可以遍历b中的每个项目并推送到a,但是有更有效的方法吗?在将数组转换为WinJS.Binding.List之前,我也不想连接数组,因为我正在从2个不同的数据源进行2次异步调用。上面的代码只是一个简化的例子。

2 个答案:

答案 0 :(得分:2)

你可以从列表中获取2个数组(使用切片),连接它们然后创建一个新列表。

var a = new WinJS.Binding.List([1, 2]);
var b = new WinJS.Binding.List([3, 4]);
var ab = new WinJS.Binding.List(a.slice(0).concat(b.slice(0)));

也可以使用list concat方法(而不是原生的js concat)来缩短它:

var a = new WinJS.Binding.List([1, 2]);
var b = new WinJS.Binding.List([3, 4]);
var ab = new WinJS.Binding.List(a.concat(b.slice(0)));

答案 1 :(得分:1)

根据您的描述,我将假设您的数据是从不同的来源返回的,并且(a)已经在单独的WinJS.Binding.List实例中,使投影不可行或(b)语义上不同以保证存储在单独的列表实例。

在这种情况下,我的方法可能是使用事件监听器同步连接列表:

[list1, list2].forEach (list) ->
  list.oniteminserted = (event) -> joinedList.push(event.detail.value)
  list.onitemremoved = (event) -> joinedList.splice(joinedList.indexOf(event.detail.value),1)

(替换为addEventListener和相应的removeEventListener以增加复杂性;))此方法的缺点是您无法控制最终列表中项目的顺序,这将是保证另一种排序谓词,即该模型中的进一步开销。

最后,很可能两个列表上的旧.forEach (item) -> joinedList.push(item)是解决此问题的最直接和最合适的方式。

编辑:为了更多地了解我使用投影的建议,我想到了这样的事情:

# put all items in the "big" list
item1.source = 'list1'
joinedList.push(item1)
item2.source = 'list2'
joinedList.push(item2)
# create separate lists using projection
list1 = joinedList.createFiltered (i) -> i.source is 'list1'
list2 = joinedList.createFiltered (i) -> i.source is 'list2'