Knockout映射添加函数

时间:2012-11-27 04:24:18

标签: knockout.js knockout-mapping-plugin

我正在尝试为表单上的按钮添加一个功能。我一直收到一条警告我未定义的消息。

我试图声明我的映射:

$(function () {

        var mapping = {
            create: function (options) {
                return new CsvImportItem(options.data);
            },
            alertMe: function () {
                alert('Here we go');
            }
        }


        var CsvImportItem = function (data) {
            ko.mapping.fromJS(data, {}, this);

            this.rowClass = ko.computed(function () {
                if (this.Accepted()) return 'success'; else return 'error';
            }, this);

            this.acceptItem = function () {
                this.Accepted(true);
            };

            this.declineItem = function () {
                this.Accepted(false);
            };

        }
        var viewModelJSON = ko.mapping.fromJS($.parseJSON('@Html.Raw(jsonData)'), mapping);

        ko.applyBindings(viewModelJSON);
    });

如果我将viewModelJSON更改为:

var viewModelJSON = ko.mapping.fromJS($.parseJSON('@Html.Raw(jsonData)'), {}, mapping);

然后alertMe函数调用工作,但我的其他显示项不起作用。关于我做错了什么的想法?

更新以显示数据结构

我进入视图的数据结构是

类型
IEnumberable<Project.Namespace.CsvImportItem>

因此,我得到的结构如下:

[
 {CsvImportItem},
 {CsvImportItem},
 {CsvImportItem}
]

1 个答案:

答案 0 :(得分:2)

您正在尝试将json映射应用于映射对象,正确的语法

var viewModelJSON = ko.mapping.fromJS($.parseJSON('@Html.Raw(jsonData)'), mapping);

同样跳过映射,对于像这样的简单场景不需要它

ko.applyBindings(new CsvImportItem($.parseJSON('@Html.Raw(jsonData)')));