2013-06-03 20 views
18

foreachバインディングとソートを組み合わせる際に問題があります。私はそうのような束縛リストを持っている:これはうまく私に私「ウィジェット」のリストを与える作品ノックアウト - foreachとソートを併用する

var widgets= ko.observableArray(); 

<article data-bind="foreach: widgets"> 

ウィジェットは簡単obvservable配列です。このリストに新しい「ウィジェット」を追加すると、データバインディングを介してリストに動的に表示されます。

しかし、すぐに私は配列に並べ替え追加する:

<article data-bind="foreach: widgets.sort(function (left, right) { return left.order() == right.order() ? 0 : (left.order() < right.order() ? -1 : 1); })"> 

その後、新たに追加されたウィジェットは、もはや私のリストに表示されます - 私はページをリロードしない限り。 (ソートはこの時点でうまく機能します。ソートしている「オーダー」フィールドを更新すると、リスト内のアイテムが動的に並べ替えられます)。

どのように私の観察可能な配列の新しい項目の動的な更新でうまくいくように並べ替えを取得することができますか?

私はデータを取得するためにBreezejを使用していますが、このシナリオには影響していないと思います。

答えて

29

observableArray.sortは、ソートされた基になる( "通常"の)配列で、observableArrayではなく、UIに変更が表示されない理由を返します。

並べ替えとUIを更新するには、並べ替えを行い、計算結果をバインディングで使用するko.computedを作成する必要があります。 ko.computedwidgetsの変更をリッスンし、並べ替えを再計算するためです。 - うまく働いたあなたThank-

<article data-bind="foreach: sortedWidgets" /> 
+0

var widgets= ko.observableArray(); var sortedWidgets = ko.computed(function() { return widgets().sort(function (left, right) { return left.order() == right.order() ? 0 : (left.order() < right.order() ? -1 : 1); }); }); 

その後、あなたがそれをバインドすることができます。 ko.computedの最初に "function()"を含めるように答えを更新してください(最初のカッコ内)。私はそれを答えとして受け入れます。 – daveywc

+0

上記の答えに加えて、ネストされたforeach、つまりトップレベルのリストのウィジェットのナビゲーションプロパティのforeachに対してこの作業を行うにはどうすればよいですか?この場合、私はバインディングしているobservable配列を明示的に宣言していないので、この方法を使用する方法がわかりません。 – daveywc

+0

私は私の答えに入力ミスを修正しました。私はBreezejsに慣れていませんが、これらのカスタムソートプロパティを作成するように設定できると思います。とにかくJSは動的なので、既存のオブジェクトに新しいプロパティを追加することができます。 – nemesv

関連する問題