【问题标题】:Knockout ko.mappings.fromJS not working淘汰赛 ko.mappings.fromJS 不工作
【发布时间】:2016-11-25 05:00:11
【问题描述】:

我正在尝试使用淘汰赛映射,但它没有按预期工作。 在这里,我创建了最简单的小提琴,但它不起作用。

我错过了什么吗?

https://jsfiddle.net/p48d11j5/1/

function Model(){
    var self = this;

    self.Id = ko.observable(0);
    self.Name = ko.observable("Default");
    self.Visible = ko.observable(false);
    self.Items = ko.observableArray([]);
}

function ModelItem(){
    var self = this;

    self.Id = ko.observable(0);
    self.Name = ko.observable("Default item name")
}

var m = new Model();

ko.mapping.fromJS({
    Id:1,
    Name: "Test",
    Visible: true,
    Items: [
    {
        Id:1,
        Name:"First"
    },
    {
        Id:2,
        Name:"Second"
    }
  ]
}, m);

ko.applyBindings(m);

编辑:我正在使用嵌套数组,所以我添加了数组

edit2:我想让模型“类型化”以使用它们的函数或 ko.computed 属性

【问题讨论】:

  • 这是你想要做的吗? jsfiddle.net/kyr6w2x3/21
  • @Matt.kaaj 是的,就是这样,但我想使用映射插件,所以我不需要以这种方式传递数据。
  • 如果您想使用mapping plugin,请查看我的回答。

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


【解决方案1】:

如果您使用两个参数调用ko.mapping.fromJS
ko.mapping.fromJS(data, mappedObject) 第二个参数是已经创建的mappedObject。那么第二个参数将被视为viewModel 而不是options

您所要做的就是:ko.mapping.fromJS(data, {}, viewModel) - 这个将您的数据放入您的模型中。

ko.mapping.fromJS({
    Id:1,
    Name: "Test",
    Visible: true,
    Items: [{Id: 1, Name: "First"}, {Id: 2, Name: "Second"}]
  }, {} ,m);  // pass the second argument as an empty object.

【讨论】:

    【解决方案2】:

    试试这个

    var m = ko.mapping.fromJS({
        Id:1,
      Name: "Test",
      Visible: true,
      Items: [
        {
            Id:1,
          Name:"First"
        },
        {
            Id:2,
          Name:"Second"
        }
      ]
    }, new Model());
    
    ko.applyBindings(m);
    

    工作示例:https://jsfiddle.net/p48d11j5/2/

    【讨论】:

      【解决方案3】:

      您可以尝试这样的事情,使用映射插件来设置您的默认状态以及应用更新:

      // Set up the initial model.
      var model = ko.mapping.fromJS({
          Id: 0,
          Name: "Default",
          Visible: false,
          Items: []
      });
      
      ko.applyBindings(model);
      
      // Map new data from the "server"...
      var model = ko.mapping.fromJS({
          Id:1,
          Name: "Test",
          Visible: true,
          Items: [
          {
              Id:1,
              Name:"First"
          },
          {
              Id:2,
              Name:"Second"
          }
          ]
      }, model);
      
      // ...or directly manipulate the model.
      model.Id(2);
      model.Items.push({Id: 3, Name: "Third"});
      

      https://jsfiddle.net/3evtx022/

      【讨论】:

      • 感谢您的回复。但我希望模型具有“类型”,所以我可以在它们上使用函数或 ko.computed 属性。有什么办法吗?还是我应该放弃?
      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 2012-07-17
      • 2014-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      相关资源
      最近更新 更多