我正在尝试将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次异步调用。上面的代码只是一个简化的例子。
答案 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'