1

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

输入:

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][...]

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

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

4

2 回答 2

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)));
于 2013-04-08T00:59:21.420 回答
1

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

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

[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'
于 2013-03-26T20:56:57.983 回答