【问题标题】:Inserting a knockout computed observable in an observableArray that is generated with the ko.mapping plugin在使用 ko.mapping 插件生成的 observableArray 中插入敲除计算 observable
【发布时间】:2013-02-14 21:33:12
【问题描述】:

是否可以手动将计算出的 observable 插入到使用映射插件生成的数组中?这是一个不使用映射插件的例子,但我想知道它是否可以使用它。

假设我有来自服务器的 JSON 数据:

[{
    "OrderID":1,
    "FirstName":"Bill",
    "LastName":"Smith",
},{
    "OrderID":2,
    "FirstName":"Jeff",
    "LastName":"Evans",
}
{
    "OrderID":3,
    "FirstName":"Dan",
    "LastName":"Johnson",
}]

在我看来,我有一个 Order 类和一个视图模型:

function Order(order) {
  var self = this;
  self.OrderID = ko.observable(order.OrderID);
  self.FirstName = ko.observable(order.FirstName);
  self.LastName = ko.observable(order.LastName);

  /*This is what I want to insert after the mapping plugin 
  generates "orders on the ViewModel*/
  self.FullName = ko.computed(function () {
      return self.FirstName() + ' ' + self.LastName();
  });

}

function ViewModel() {
  var self = this;
  self.orders = ko.observableArray([])

//Get orders
  $.ajax({
    url: '@Url.Action("orders")',
    type: "post",
    success: function (data) {
        var mappedOrders = $.map(data, function (item) { return new Order(item) });
        self.orders(mappedOrders);
     }
   })    
}

是否可以使用映射插件在视图模型上生成订单数组,也可以在订单数组中插入计算出的 observable "FullName"?

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    在考虑了文档之后,我成功地将其应用于我的示例,如 this jsFiddle 和以下几行所示:

    var data = [{
        OrderID: '1',
        FirstName: 'Bob',
        LastName: 'Stevens'
    }, {
        OrderID: '2',
        FirstName: 'Jim',
        LastName: 'Johnson'
    
    }];
    
    function order(data) {
        var self = this;
        var model = ko.mapping.fromJS(data, {}, self);
        model.FullName = ko.computed(function () {
            return self.FirstName() + ' ' + self.LastName();
        });
        return model;
    }
    
    var mapping = {
        create: function (options) {
            return new order(options.data);
        }
    };
    
    function viewModel() {
        var self = this;
        self.orders = ko.mapping.fromJS(data, mapping);
    }
    
    var vm = new viewModel();
    
    ko.applyBindings(vm);
    

    【讨论】:

      【解决方案2】:

      你可以,根据documentation

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

      【讨论】:

      • 谢谢,这很有帮助。但我只从这里看到如何从数据的一个属性(即 children -> nameLength)中生成一个计算出的 observable。如何从两个或多个属性中生成一个计算出的 observable?
      • 对不起,我昨晚出去了,所以直到现在才看到你的后续问题。很高兴你最后把它整理好了。不过,从技术上讲,我会说我完全回答了你提出的问题,所以我认为最不值得点赞!
      猜你喜欢
      • 1970-01-01
      • 2018-02-24
      • 2015-07-03
      • 1970-01-01
      • 2012-06-26
      • 2013-02-12
      • 2013-12-22
      • 1970-01-01
      • 2018-05-07
      相关资源
      最近更新 更多