2012-03-04 9 views
7

jQuery $.ajaxコールとKnockout JSを使用して生成されたページに添付ファイルのリストがあります。KnockoutでAjaxコール後にリストを更新するJS

私のHTMLは次のようになります(これはバック取り除かれる):

$(function() { 
    getFormAttachments(); 
}); 

function getAttachments() { 
    var request = $.ajax({ 
    type: "GET", 
    datatype: "json", 
    url: "/Attachment/GetAttachments" 
    }); 

    request.done(function (response) { 
    ko.applyBindings(new vm(response)); 
    }); 
} 

マイビューモデル:

<tbody data-bind="foreach: attachments"> 
    <tr> 
    <td data-bind="text: Filename" /> 
    </tr> 
</tbody> 

私は、JSONレスポンスとして返される添付ファイルのリストを取得する機能を持っています次のようになります。

このリストを更新するには、時間の添付ファイルが削除/追加された可能性があります上:添付ファイルのリストの最初のレンダリングは結構です

$(function() { 
    $("#refresh").on("click", getAttachments); 
}); 

、しかし私は、リストをクリックして更新ボタンを経由して再びgetAttachmentsを呼び出すときに、実際に(に追加された各項目があります複数回複製)。

私はここで、この問題を示すためにjsFiddleを作成しました:

http://jsfiddle.net/CpdbJ/137

私が間違って何をしているのですか?

+0

Kev - nice post。私はまだそれで少し混乱しています。ノックアウトを初めて。私はページロード時にViewModelにAJAXデータをロードするだけで同様の問題を抱えています。私はちょっとした、真面目なことを欠いていると確信しています。私を混乱させる1つのチュートリアルでは、オブジェクトとして(例えば 'var viewmodel = {something:ko.observable()}')と他のものを 'viewModel'を関数として表示するチュートリアルがあります(関数ViewModel(){this.something = ko。observable()} ') - 任意の提案ですか? –

+0

@ one.beat.consumer - フォローアップの質問を参照してください:http://stackoverflow.com/questions/9589419/difference-between-knockout-view-models-declared-as-object-literals-vs-functions - the以下のコメントは物事をより明確にするはずです。私は$ 25を費やしてこれを見てみることをお勧めします:http://www.pluralsight-training.net/microsoft/Courses/TableOfContents?courseName=knockout-mvvm – Kev

+0

あなたの他の質問をチェックします。ありがとうございました。私は複数のサブスクリプションを持っており、私はそれを2〜3回見てきました...彼らはほとんど表面を傷つけず、2.0が出ていて、多くの人は1.2,1.3のベータ版を使用していました... –

答えて

10

あなたのサンプルを修正するフィドルです。あなたの最大の問題は、あなたが 'applyBindings'を複数回呼び出すことでした。一般に、ページの読み込み時にapplyBindingsを呼び出すと、ページがビューモデルとやり取りされ、Knockoutがページの一部を更新します。

http://jsfiddle.net/CpdbJ/136

HTML

<table> 
    <thead> 
     <tr><th>File Name</th></tr> 
    </thead> 
    <tbody data-bind="foreach: attachments"> 
     <tr><td data-bind="text: Filename" /></tr> 
    </tbody> 
</table> 
<button data-bind="click: refresh">Refresh</button> 

javascriptの

$(function() { 
    var ViewModel = function() { 
    var self = this; 

    self.count = 0; 
    self.getAttachments = function() { 
     var data = [{ Filename: "f"+(self.count*2+1)+".doc" }, 
        { Filename: "f"+(self.count*2+2)+".doc"}]; 
     self.count = self.count + 1; 
     return data; 
    } 

    self.attachments = ko.observableArray(self.getAttachments()); 

    self.refresh = function() { 
     self.attachments(self.getAttachments());   
    } 
    }; 

    ko.applyBindings(new ViewModel()); 
}); 

からhttp://knockoutjs.com/documentation/plugins-mapping.html -

また、マッピング・プラグインを見てみたいことがあります。 JSONをView Modelに変換するのに役立ちます。さらに、オブジェクトの「キー」になるプロパティを割り当てることができます。これは、後続のマッピングで古いオブジェクトと新しいオブジェクトを判断するために使用されます。ここで

はフィドルが、私は同様のアイデアを証明するために戻ってしばらく書いている:

http://jsfiddle.net/wgZ59/276

注:私は私のマッピングルールの一部として、「更新」を使用しますが、唯一の私はにログインすることができますコンソール。マッピングプラグインが更新されたオブジェクトをどのように更新するかをカスタマイズしたい場合は、これを追加する必要があります。

+0

データがなく、AjaxメソッドとGETメソッドを呼び出す必要があるとします。 – Vyache

+0

単にgetAttachments呼び出しを変更してAJAX呼び出しを行い、コールバックで結果をattachments observable配列に直接設定します。リフレッシュはself.getAttachments()を呼び出すだけです。添付ファイルは空の状態で初期化され、直ちにself.getAttachments()を呼び出して最初のAJAX呼び出しを行うことができます。コールバックが結果を設定すると、KnockoutはUIを更新します。 –

+0

ええと、何らかの理由でこのメソッドでデータを更新することはできません。私の質問をご覧ください:http://stackoverflow.com/questions/21558075/how-do-i-update-my-model-using-ajax-and -mapping-plugin – Vyache

関連する問題