【问题标题】:Ignore properties on knockout viewmodel when serialized from aspnetmvc从 aspnetmvc 序列化时忽略淘汰视图模型上的属性
【发布时间】:2013-08-12 23:11:50
【问题描述】:

我有一个 ASPNET mvc 站点,其中视图具有带有敲除的视图模型。我正在尝试将传递给视图的模型序列化为视图视图模型。

模型通过类似标准的aspnet mvc传递给

@model Client.Controllers.TripDto

使用 KO 映射创建的淘汰视图模型的完成方式类似于

        var jsonModel = '@Html.Raw(JsonConvert.SerializeObject(this.Model))';
        var mvcModel = ko.mapping.fromJSON(jsonModel);
        var viewModel = new TripViewModel();
        var mapping = {
            'ignore': ["expenses"]
        };
        ko.mapping.fromJS(mvcModel, mapping, viewModel);

        ko.applyBindings(viewModel);

我在 KO“自定义”视图模型上有一笔财产费用。问题是这个属性不在 MVC 模型中,而只是一个稍后获取其数据的属性。 但到目前为止,我还无法将模型传递到视图模型中而不会出现错误

错误:无法解析绑定。消息:ReferenceError:费用未定义;绑定值:foreach:费用 [打破这个错误]

return new Function("$context", "$element", functionBody);

我有点不确定是否真的是映射失败,但到目前为止还看不到任何可能的错误。

所以问题是,是否可以在我正在映射的模型中不存在所有属性的情况下使用 KO 映射?

【问题讨论】:

    标签: asp.net-mvc knockout.js knockout-mapping-plugin


    【解决方案1】:

    是否可以在并非所有属性都存在的情况下使用 KO 映射 在我映射的模型中?

    我认为 KO 映射并不关心这一点,但模型关心。当您调用 ko.applyBindings 时,KO 将搜索与 HTML 元素关联的属性,因此如果您要在 HTML 元素 data-bind='id: property' 中使用属性,那么该属性必须存在于您的 View-Model 中。但如果它为空,那就没关系。

    您只需要扩展您的视图模型,因此将新属性 expenses 包含在默认值中,例如 null

    var mapping = {
        create: function (options) {
            //customize at the root level.  
            var innerModel = ko.mapping.fromJS(options.data);
    
            innerModel.expenses= null;
    
            return innerModel;
        }
    }
    

    请检查此SO question

    【讨论】:

    • 谢谢,该属性已经在自定义视图模型中定义为 self.expenses = ko.observableArray();
    • 我遇到了类似的问题,我使用 underscore.js 设置了默认的空数组/对象,这样映射插件就不会乱了。如果需要,很乐意提供示例链接。
    • 实际上我的问题与延迟加载有关,现在正在使用这种方法。但是感谢有关创建的信息!
    猜你喜欢
    • 2013-02-28
    • 2012-03-06
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2016-05-05
    • 2018-06-15
    相关资源
    最近更新 更多