1

KnockoutJSKnockout Mappingを使用して、ASP.NET Webforms アプリケーションにデータをバインドしようとしています。

HTML

<script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script>
<script src="Scripts/knockout-2.3.0.js" type="text/javascript"></script>
<script src="Scripts/knockout.mapping-latest.js" type="text/javascript"></script>
<script type="text/javascript">

    function bindModel(data) {
        var viewModel;
        viewModel = ko.mapping.fromJS(data);
        console.log(viewModel);
        ko.applyBindings(viewModel);
    }

    $(document).ready(function () {
        $.ajax({
            url: "TestPage.aspx/GetItems",
            data: {},
            type: "POST",
            contentType: "application/json",
            dataType: "JSON",
            timeout: 10000,
            success: function (result) {
                bindModel(result);
            },
            error: function (xhr, status) {
                alert(status + " - " + xhr.responseText);
            }
        });
    });
</script>
...
<table>
    <thead>
        <tr>
            <th>
                Id
            </th>
            <th>
                Name
            </th>
        </tr>
    </thead>
    <tbody data-bind="foreach: Item">
        <tr>
            <td data-bind="text: Id">
            </td>
            <td data-bind="text: Name">
            </td>
        </tr>
    </tbody>
</table>

C#

[WebMethod]
public static List<Item> GetItems()
{
    List<Item> itemlist = new List<Item>
        {
            new Item {Id = 1, Name = "Item1", Description = "Item 1 Description"},
            new Item {Id = 2, Name = "Item2", Description = "Item 2 Description"}
        };

    return itemlist;
}

public class Item
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }

}

JSON レスポンス

{"d":[{"__type":"KnockoutWebFormsTest.Item","Id":1,"Name":"Item1","Description":"Item 1 Description"},{"__type":"KnockoutWebFormsTest.Item","Id":2,"Name":"Item2","Description":"Item 2 Description"}]}

しかし、これによりエラーが発生し、

Uncaught ReferenceError: Unable to parse bindings.
Bindings value: foreach: Item
Message: Item is not defined

ここで何が間違っていますか、これを修正するにはどうすればよいですか?


編集 :

bindModel次のように、データで直接呼び出す場合

bindModel({ "d": [{ "__type": "KnockoutWebFormsTest.Item", "Id": 21, "Name": "Item1", "Description": "Item 1 Description" }, { "__type": "KnockoutWebFormsTest.Item", "Id": 2, "Name": "Item2", "Description": "Item 2 Description"}] });

に変更data-bind="foreach: Item"しますdata-bind="foreach: d"(david.sの提案による)

それは正常に動作します...しかし、JSON結果をbindModelに直接渡すと、エラーが発生します

d is not defined

この問題を解決する方法はありますか?

4

3 に答える 3

0

推測ですが、バインドする配列を渡していません。json オブジェクトを渡しています。{d:[{foo:bar},{foo:bar},]}

「d」に含まれる配列にアクセスするには、この行bindModel(result); を次のように変更できます。bindModel(result.d);

私はJSBinを作成しました.. http://jsbin.com/uxikew/2/edit

ajax 呼び出しは削除されましたが、要点はわかります。

于 2013-08-02T04:37:16.743 に答える
-1

すべての答えと助けをありがとう...

最後にそれを機能させることができました、

に変更することによってdata-bind="foreach: Item"data-bind="foreach: d"david.sによって提案されたように)

そしてviewModel = ko.mapping.fromJS(data);_viewModel = ko.mapping.fromJSON(data);

于 2013-08-02T10:44:48.943 に答える