2013-04-30 24 views
8

私はオブジェクトのコレクション「ファイル」を含むビューモデルを持っています。ノックアウト - ViewModelからアイテムを削除してもDOMから削除されない

明らかに、これはDOMにバインドされています。

「ファイル」コレクションからアイテムを削除すると、これを反映するためにDOMを更新することが期待されますが、更新はされません。

これは、「ファイル」コレクションからアイテムを削除するために使用するJSです。

this.Delete = function(id) { 
    for (var f = 0; f < this.Files.length; f++) { 
     if (this.Files[f].ID() == id) { 
      this.Files.splice(f, 1); 
     } 
    } 
}.bind(this); 

私は(ID)を削除呼び出した後、コンソールにコレクションの長さを印刷する場合、私はアイテム削除されていることがわかります。

なぜDOMは更新されませんか?

私は...それ更新を行いますが、私の理解は、私は毎回ビューモデルの更新これを呼び出す必要はありませんということです(ko.applyBindingsを呼び出した場合。

だから私は何をかもしれません間違っているの

また、私は何の違いなしで、observableArrayと標準配列としてファイルでそれを試してみた

UPDATE:?。をここにビューモデルの定義は(も...関連です一部、とにかく)

function Files(files) { 

    var self = this; 

    self.Files = ko.observableArray([]); 

    this.Delete = function(id) { 
     // find which index the specified ID exists at 
     for (var f = 0; f < this.Files().length; f++) { 
      if (this.Files()[f].ID() == id) { 
       this.Files().splice(f, 1); 
      } 
     } 
    }.bind(this); 

    ... 
} 

は、私はまた、

self.Files = []; 

でそれを試してみましたが、その後、ファイルのすべてのインスタンス()へのファイルだけを変更しました。変わりはない。そうでなければ、することなく、基になる配列のフォーム項目を削除

this.Delete = function(id) { 
    // find which index the specified ID exists at 
    for (var f = 0; f < this.Files().length; f++) { 
     if (this.Files()[f].ID() == id) { 
      this.Files.splice(f, 1); 
     } 
    } 
}.bind(this); 

self.Files = ko.observableArray([]); 

しかし、あなたはthis.Files.spliceで観察アレイ上に直接spliceを呼び出す必要があります:あなたは、観察の配列を持っている必要があり

+1

がどのように 'files'をがdefiniedさ:ところで

はobservableArrayは大幅にコードを簡素化することができremove機能を持っていますか?それは 'observableArray'でなければなりません。そうでなければうまくいきます。' observableArray'で試したことがありますが、 'Delete'関数のそのバージョンを投稿できますか? – nemesv

答えて

8

KOは削除について知っているので、DOMを更新することはできません。ドキュメントManipulating an observableArrayを参照してください。

this.Delete = function(id) { 
    this.Files.remove(function(item) { return item.ID() == id; });   
}.bind(this); 
+0

じゃあ、とてもシンプルですが、私はおそらくこれを理解しようと数時間を費やしました。多くのありがとう@nemesv。 – awj

+0

あなたのthis.Files.removeの提案には、item.ID()は単にitem.ID(カッコなし)でなければならないという小さな変更が必要です。再度、感謝します。 – awj

+0

あなたのサンプルに '.ID()'がありました。私はあなたの 'ID'プロパティが' ko.observable'であるとコピーしました。 – nemesv

関連する問題