KnockoutJS映射模型添加到Observable数组

时间:2012-12-05 05:53:26

标签: jquery json knockout.js knockout-mapping-plugin

我想从动态模型创建一个Observable Array,它基本上是一个获取JSON信息的AJAX帖子。然后我想将该数组添加到表中。

这是我创建Viewmodel的Javascript,以及添加到数组中的内容:

var ProductViewmodel;
    function bindProductModel(Products) {
        var self = this;
        self.items = ko.mapping.fromJS([]);
        ProductViewmodel = ko.mapping.fromJS(Products, self.items);
        console.log(ProductViewmodel);
        ko.applyBindings(ProductViewmodel);
    }

    function JSONProducts() {
        $.ajax({
            url: "WebForm1.aspx/AvailibleProducts",
            // Current Page, Method  
            data: '{Warehouse: 1}',
            // parameter map as JSON  
            type: "POST",
            // data has to be POSTed  
            contentType: "application/json; charset=utf-8",
            // posting JSON content      
            dataType: "JSON",
            // type of data is JSON (must be upper case!)  
            timeout: 10000,
            // AJAX timeout  
            success: function (result) {
                bindProductModel(result);
            },
            error: function (xhr, status) {
                alert(status + " - " + xhr.responseText);
            }
        });
    }

获得JSON非常有效:

{
"d": [
    {
        "__type": "Warehouse.Tracntrace.Members_Only.StockMovement.ProductStagingMethod",
        "ProductSKUID": 2,
        "ProductSKUName": "Decoder 1131",
        "WarehouseID": 1,
        "WarehouseName": "SoftwareDevelopmentTest",
        "SystemAreaName": "Staging",
        "Qty": 5
    }
]

}

这里是我尝试数据绑定到我的表格的地方:

<div id="TableContainer" class="gridview">
    <table border="1" cellpadding="0" cellspacing="0">
     <tbody data-bind="foreach: ProductViewmodel">
       <tr>
        <td data-bind="text: ProductSKUID"></td>
        <td data-bind="text: ProductSKUName"></td>
        <td data-bind="text: WarehouseID"></td>
        <td data-bind="text: WarehouseName"></td>
        <td data-bind="text: SystemAreaName"></td>
        <td data-bind="text: QTY"></td>

        </tr>
        </tbody>
    </table>
</div>

似乎它不想将它添加到我的数组中。 任何建议都将不胜感激。

此致 雅克

2 个答案:

答案 0 :(得分:1)

您的代码有3个问题:

  1. data-bind="foreach: ProductViewmodel"您试图整体ProductViewmodel,但您需要在items上进行操作。因此,将其更改为<tbody data-bind="foreach: items">
  2. 您的json对象包含在d属性中,因此您需要在映射中处理它。所以你需要写:ProductViewmodel = ko.mapping.fromJS(Products.d, self.items);
  3. 您错误地输入了Qty属性名称。正确的绑定是:<td data-bind="text: Qty"></td>(数据绑定表达式区分大小写)
  4. created a fiddle代码中包含修复程序。

答案 1 :(得分:0)

你需要使用ko.mapping.fromJSON而不是ko.mapping.fromJS吗?