【问题标题】:Knockout mapping adding a function敲除映射添加功能
【发布时间】:2012-11-27 20:51:14
【问题描述】:

我正在尝试向表单上的按钮添加功能。我不断收到一条消息说 alertMe 未定义。

我试图这样声明我的映射:

$(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}
]

【问题讨论】:

  • 为什么要在映射中添加alertMe?为什么只将alertMe 定义放在CsvImportItem 对象上?
  • 我希望函数在 CsvImportItems 的集合上工作,而不是在 1 个 CsvImportItem 的实例上工作,例如我的函数 rowClass、acceptItem 和dendItem。我会更新我的帖子,让我的数据更清晰。

标签: knockout.js knockout-mapping-plugin


【解决方案1】:

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

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

同样跳过映射,像这样的简单场景不需要它就可以了

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

【讨论】:

  • CsvImportItem 不是父类,而是我的数据是 CsvImportItems 的集合,我已经成功地为每个实例声明了函数(rowClass、acceptItem 和 downItem。我正在尝试运行对整个 CsvImportItems 集合的函数,这是我将结果集回发到我的控制器的前兆。
  • Okej,那么您应该像我回答中的第一个代码示例一样执行此操作,您的示例代码尝试将 JSON 数据映射到错误的映射对象。即用映射替换{}
  • 感谢您的回复。我已经在调用代码var viewModelJSON = ko.mapping.fromJS($.parseJSON('@Html.Raw(jsonData)'), mapping); 我只是把我尝试的第二种方式作为附加信息。无论出于何种原因,如果我使用第二个代码片段,alertMe 就可以工作,但没有其他工作。奇怪的。我正在努力把小提琴放在一起。
  • 为什么映射对象会有警报?它应该在那里,映射对象只是映射插件的帮助对象
  • 要回帖,您只需执行 ko.toJS,如果您使用 jQuery 进行 ajax 帖子,请务必在帖子上设置 JSON 数据格式,否则 jQuery 将默认形成 MVC 控制器无法理解的帖子格式如何解码
猜你喜欢
  • 1970-01-01
  • 2013-09-22
  • 1970-01-01
  • 2013-07-17
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
相关资源
最近更新 更多