Knockout JS Mapping fromJS嵌套模型

时间:2016-01-27 14:26:13

标签: javascript jquery rest knockout.js knockout-mapping-plugin

我无法理解如何使用Knockout JS Mapping Plugin。我有一些嵌套模型(如下所示),我目前正在做的只是在父模型中使用ko.mapping.fromJS()。我注意到的是计算值没有被计算出来。

我试着理解“创造”:

var mapping = {
    'children': {
        create: function(options) {
            return new myChildModel(options.data);
        }
    }
}
var viewModel = ko.mapping.fromJS(data, mapping);

但是现在在我目前的情况下,我不确定如何实施。

目前的结构:

var ProductModel = function($name, $price, $quantity) {
    var self = this;

    self.id = ko.observable();
    self.name = ko.observable($name);
    self.quantity = ko.observable($quantity);
    self.price = ko.observable($price);
    self.price.total = ko.computed(function() {
        return self.price() * self.quantity();
    });
};


var CartModel =  function (){
   var self = this;

   // Model Properties
   self.id = ko.observable();   
   self.products = ko.observableArray();   

    self.fetch = function() {
        $.ajax({
            url: "route to get the specific cart",
            type: "GET",
            success: function(data) {                
                ko.mapping.fromJS(data, {}, self);
            }
        });
    };   

    // Convert to mapping format
    ko.mapping.fromJS(ko.mapping.toJS(self));
};

var ViewModel = ko.validatedObservable(new CartModel());
ko.applyBindings(new ViewModel());

我不确定如何让ProductModel触发ProductModel中的计算,我不确定是否必须在每个模型中调用ko.mapping.fromJS(我有更多模型,我将它们剥离了使它更简单)。

在获取功能之后,我提醒了products()。长度,它实际上包含以前保存的数量。但计算机没有显示。如何为嵌套的observable(和observablearrays)实现knockout mapping插件的create方法,这些嵌套是在其内部计算的模型。

P.S:我有它self.price.total的原因是为了避免toJS发送总密钥。我不能忽略使用ignore的嵌套模型的属性:

有关详情,请参阅此主题:Knockout JS Mapping fromJS nested models

1 个答案:

答案 0 :(得分:0)

您的ajax响应如何?它会返回整个购物车还是产品?

无论如何,如果你想把你的产品列表作为一个observableArray视图模型处理,你可以这样做:

ko.utils.arrayForEach(products, function(item, index) {
  self.products.push(new ProductModel(item.name, item.price, item.qty);
});

如果你想使用映射插件,我还没有自定义实现"创建"方法,但我会做类似的事情:

var ProductModel = function(product) {
  var self = this;

  ko.mapping.fromJS(product, {}, self);

  self.total = ko.computed(function() {
      return self.price() * self.quantity();
  });
};

修改

我已经重新阅读了您的问题,我认为this answer可能是您正在寻找的东西,这种方法的唯一缺点,至少对我而言,是您需要定义的每个viewmodel的映射配置对象,在代码中使用嵌套的viewmodel