Knockout JS将Json对象的数组转换为经过验证的可观察对象

时间:2013-05-24 21:40:41

标签: jquery knockout.js

如果我从服务器检索我的视图模型,如下所示:

$.getJSON('/Items/', function (data) {
    var mapped = ko.mapping.fromJS(data);
    self.ViewModel(mapped);
});

它有一个名为Items的数组,其中包含一个Item,如何将数组中的所有Item对象都转换为validatedObservables?这甚至可能吗?

我使用表格来选择我要编辑的项目。这是我的表:

 <tbody data-bind="foreach: ViewModel().Items">
        <tr>
            <td data-bind="text: ItemName"></td>
            <td data-bind="text: ItemCost"></td>
            <td data-bind="text: CategoryName"></td>
            <td><a data-bind="click: $root.EditItemPopup">Edit Item</a></td>
        </tr>
    </tbody>

点击事件连接到此功能:

self.ItemToEdit = ko.validatedObservable(Item);
self.EditItemPopup = function (something) {
    self.ItemToEdit(something);
    self.FindMatchingCategory(something.CategoryID());
    $("#editItemPopup").dialog("open");
};

当我调用self.ItemToEdit()。ItemName.isModified(false)时,它告诉我方法未定义。

谢谢!

1 个答案:

答案 0 :(得分:0)

淘汰映射插件允许您在执行映射时提供映射作为参数。您可以为“商品”实体创建地图,并在地图的create功能中应用validatedObservable扩展程序。在您的示例中,您要将数组发送到ko.mapping.fromJS,所以:

var itemMap = {
    create: function (options) {
        var koItem = ko.mapping.fromJS(options.data);//regular mapping
        var koItemValidated = ko.validatedObservable(koItem);//turn it into validatedObservable
        return koItemValidated;//return the validatedObservable
      }
};

$.getJSON('/Items/', function (data) {
    var itemsObj = {items:data};//create an object with a property of "items"
    var mapped = ko.mapping.fromJS(data, {'items':itemMap});//for each item in items, use itemMap
    self.ViewModel(mapped);
});

More info on the map param of ko.mapping here.