强制ko.mapping创建具有映射属性的空数组

时间:2012-06-14 17:39:20

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

我正在使用mvc4中的模型在Knockout中创建一个视图模型。我正在使用映射插件。目前的代码看起来像这样。

首先:我将我需要的不同MVC4模型合并到一个ko视图模型中。

var mergedData = $.extend(true, {}, initialEventData,
    { "Tickets": initialTicketData }, { "TimeZones": timeZones }
);

第二:我添加一些映射以将计算函数添加到我的viewmodel。

var mapping = {
    'Tickets': {
        create: function (options) {
            return new updatedTicket(options.data);
        }
    }
}

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

    this.formattedPrice = ko.computed(function () {
        return "$" + parseFloat(this.Price()).toFixed(2);
    }, this);
}

Finlly:我应用绑定。

var eventViewModel = ko.mapping.fromJS(mergedData, mapping);

然而:有时候,Tickets模型可能会变空。发生这种情况时,映射插件不会创建可观察数组(显然)。我需要创建一个带有映射属性的空数组,以便我可以推送新票。

2 个答案:

答案 0 :(得分:0)

我只想添加一个检查映射配置。检查updatedTicket函数中是否存在数据,如果不存在,则手动创建可观察数组

答案 1 :(得分:0)

只需创建一个容器视图模型,您可以在其中创建默认票证数组... 同样在你的回调函数中,请确保使用一个引用“this”的变量

   var mapping = {
    'Tickets': {
        create: function (options) {
            return new updatedTicket(options.data);
        }
    }
}

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

    this.formattedPrice = ko.computed(function () {
        return "$" + parseFloat(self.Price()).toFixed(2);
    }, this);
}

var viewModel = function ( )  {
    this.Tickets = ko.observableArray([]);
    ko.mapping.fromJS(mergedData, mapping, this);
}

var eventViewModel = new viewModel();