2013-03-15 11 views
31

observableArrayのアイテムのすべてのコンテンツを新しいコンテンツに置き換えようとしています。observableArrayのアイテムを交換する

var oldLocation = ko.utils.arrayFirst(self.locations(), function (item) { 
    return item.id == value.id; 
}); 
self.locations.replace(self.locations.indexOf(oldLocation), new location(value)); 
self.locations.valueHasMutated(); 

私も

self.locations[self.locations.indexOf(location)] = new fizi.ko.models.location(value); 

を試みた。しかし、何も作業していません。インデックスは正しく取得されていますが、アイテムの更新は行われていません。

+0

「何も問題ありません」とはどういう意味ですか?配列に新しい項目がありませんか?または、UIに置換が表示されませんか?あなたのhtmlとバインディング、そしてどのように位置オブジェクトが見えるのかを投稿してください! – nemesv

+0

です。モデルが更新されておらず、モデルも更新されていないため、モデルは更新されず、UIも更新されません。 – bflemi3

答えて

45

replace関数は、置き換えたい項目と置き換える項目の2つのパラメータを受け入れます。置き換える項目の代わりにインデックスを渡しているので、機能しません。

置き換えるコールは次のようになります。サイドノートで

self.locations.replace(oldLocation, new location(value)); 

を、あなたはそこvalueHasMutated()呼び出しを必要はありません、それはreplace()コールによって呼び出されます。

+9

地球は、観測可能な配列のreplaceメソッドを記述している文書ですか?私は見て、見て、ドキュメントのどこにもそれを見ることができませんでした! –

+4

@PaulManzotti - http://www.knockmeout.net/2011/06/10-things-to-know-about-knockoutjs-on.htmlのItem 7に、追加されたメソッドが記載されています。 – DaveB

+1

ありがとう、私はそのページをブックマークしておきます! :) –

1

JavaScriptの配列やKnockoutの置換方法がわかりません。何か不足していますか?

あなたの第二の方法を使用する場合は、あなたが観察できるよう場所にアクセスする必要があります。

self.locations()[self.locations.indexOf(location)] = new fizi.ko.models.location(value); 
self.locations.valueHasMutated(); 

観測可能な配列のそれのノックアウトバージョンがあるとして、あなたは、のindexOfを使用していないのに。

+1

どこに書かれているのかわかりませんが、ソースコードにあります:https://github.com/knockout/knockout/blob/master/src/subscribables/observableArray.js –

4

私は単にそれを行うための別の方法を言及したいと思います:

self.locations.splice(
    self.locations.indexOf(location), // Index of the 1st element to remove 
    1,         // Number of elements to remote at this index 
    new fizi.ko.models.location(value) // A param for each element to add at the index 
); 

ノックアウトは、そのドキュメントのspliceを含むが、replace含まれていません:Knockout Obervable Arrays Docsを。しかし、ソースコードを見ると、両方の関数が実装されていることがわかります(少なくともKO 3.0では、以前のバージョンではが不足しているかどうかわかりません)。

関連する問題