2

データバインディングにKnockoutJSを使用しています。次のコードはコントローラーのアクションメソッドです

public JsonResult GetPeople()
{
    var people = new List<Person>
                     {
                         new Person {Name = "aaaa", Address = "aaaaaaaaa"},
                         new Person {Name = "bbbb", Address = "bbbbbbbbb"},
                         new Person {Name = "cccc", Address = "ccccccccc"}
                     };
    return Json(people, JsonRequestBehavior.AllowGet);
}

そして、以下はクライアントサイドコードのスニペットです

<ul data-bind="foreach: people">
  <li>NAME:<span data-bind="text: Name"></span></li>
  <li>ADDRESS:<span data-bind="text: Address"></span></li>  
</ul>

<script>
    function getPeopleFromServer() {
        var people= [];

        $.ajax({
            url: "GetPeople",
            cache: false,
            type: "GET",
            success: function (result) {
                console.log("result= " + result);
                people = $.parseJSON(result);
                console.log("people= " + people);
            }
        });

        return people;
    }

    function ViewModel() {
        var self = this;

        // data
        self.people = ko.observableArray(getPeopleFromServer());        
    }

    ko.applyBindings(new ViewModel());
</script>

問題は、getPeopleFromServerメソッドのpeople変数が常にnullであるのに対し、結果にはサーバーからの適切な値があることです。私は何かが足りないのですか?

4

4 に答える 4

1

$.ajax関数は、それを含む関数よりも完了するのに時間がかかるため、people実行の終わりまでに含まれる関数がポップアップすることはありません。

あなたができることの一つはあなたのに以下を追加することです$.ajax

$.ajax({
   async: false,
   url: "GetPeople",
   .....
});

async: falseajaxが終了するまで、包含関数を「待機」させます。ピープル変数は、関数の実行が終了するまでに入力する必要があります。これはすぐに成功しますが、ViewModelの処理方法を再考する必要があるというトムの意見に同意します。

于 2012-05-17T02:26:08.437 に答える
0

ko.mappingプラグインを使用してみてください。

function ViewModelWrapper(jsonResult)
{
       var self = this;
       self.model = ko.mapping.fromJS(jsonResult);
}

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

于 2012-05-17T13:13:21.987 に答える
0

人々は同じビューモデルのどちらかで参照されるべきです。またはself.peopleとして。ビューモデル内にajaxを呼び出すことをお勧めします。そうすれば、それが明確になります。したがって、getPeopleFromServer()はビューモデル内にある必要があります。

興味深いことに、呼び出しがタイムアウトしないように、timeout:600000を追加することもできます。

于 2012-05-17T12:49:56.227 に答える
0

@tomのコメントは正しいです。

'success'はインライン非同期関数です。基本的に、「return people」は、「success」関数が呼び出される前に発生します。これは、ajax呼び出しが非ブロッキングであるためです。非同期で動作するように(または非同期をオフにするように)ViewModelを再設計する必要があります。うまくいけば、他の人がコードを修正してチャイムを鳴らします。

これが彼が予言した完全にコメントされたフィドルです。

http://jsfiddle.net/bczengel/8Wqum/

于 2012-05-20T02:20:39.507 に答える