1

私は2WinJS.Binding.Listつを1つに結合しようとしています。MSDNでこのメソッドを見ました.concatが、機能していないようです。誰かが私にそれを行う方法を教えてもらえますか?

入力:

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

期待される出力:番号1、2、3、4を含むWinJS.Binding.List。

を試し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)));

(ネイティブのjs concatではなく)list 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 に答える