Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Knockout.js Knockoutjs映射don';t向字符串数组添加可观测值_Knockout.js_Knockout Mapping Plugin - Fatal编程技术网

Knockout.js Knockoutjs映射don';t向字符串数组添加可观测值

Knockout.js Knockoutjs映射don';t向字符串数组添加可观测值,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,我正在从服务器上获取这类数据 { FirmName: "Firm Name", Address: "123 Address", AltNames: [ "First Alt Name", "Second Alt Name" ] } 我使用knockout-mappings插件将数据映射到具有ko.mapping.fromJS(数据,{},this)的v

我正在从服务器上获取这类数据

{
    FirmName: "Firm Name",
    Address: "123 Address",
    AltNames: [
        "First Alt Name",
      "Second Alt Name"
    ]
  }
我使用knockout-mappings插件将数据映射到具有ko.mapping.fromJS(数据,{},this)的viewModel

但是,每当我更改任何字符串数组元素时,我的更改都不会传播到viewModel。我该如何解决这个问题

我的js:

function firmModel() {
    //this is what I get from the server
  var data = {
    FirmName: "Firm Name",
    Address: "123 Address",
    AltNames: [
        "First Alt Name",
      "Second Alt Name"
    ]
  };
  
  ko.mapping.fromJS(data, {}, this);
  
}

var em = new firmModel();
ko.applyBindings(firmModel);
我的html:

<div>
  <label>Company</label>
  <input type="text" data-bind="value: FirmName">
</div>
<div>
  <label>Address</label>
  <input type="text" data-bind="value: Address">
</div>
<br>
<h3>
Alt Names
</h3>
<ul data-bind="foreach: AltNames">
  <li>
    <input type="text" data-bind="value: $data">
  </li>
</ul>

<br/><br/>
<h2>
Result of the changes where I see whether viewModel picks up my changes above
</h2> 
<span>Company: </span><span data-bind="text: FirmName"></span><br/>
<span>Address: </span><span data-bind="text: Address"></span><br/>
<br/>
Alt Names: <br/>
<ul data-bind="foreach: AltNames">
  <li data-bind="text: $data"></li>
</ul>

单位
地址

替换名称


更改的结果,查看viewModel是否拾取上面的更改 公司:
地址:

Alt名称:

foreach
中拨弄,您不能使用
$data

<input type="text" data-bind="value: $data">
这是一个可运行的示例:

函数模型(){
//这是我从服务器上得到的
风险值数据={
公司名称:“公司名称”,
地址:“123地址”,
其他名称:[
“第一个Alt名称”,
“第二个Alt名称”
]
};
//fromJS(数据,{},this);
变量映射={
“AltNames”:{
创建:函数(选项){
可观察的返回ko(选项数据);
}
}
}
fromJS(数据,映射,this);
}
var em=新的firmModel();
ko.应用绑定(firmModel)
h2{
字体大小:粗体;
}

单位
地址

替换名称


变化的结果 公司:
地址:

Alt名称:

何塞,非常感谢!我有一个后续问题。如果AltNames不是根元素呢。例如,`{FirmNames:{MainName:{Bla],AltNames:[“一”,“二]}}}
?我尝试过使用
“FirmNames.AltNames”:{create:function(options){return ko.observable(options.data);}}`但是它不起作用。你能把这个字符串数组改成一个对象数组吗:
{FirmNames:{MainName:“Bla”,AltNames:[{name:“One”},{name:“Two}]}
然后,插件就可以完成这项工作,而不需要
映射。我在
AltNames
中添加了
name:
。在这把小提琴中,我使用了相同的
映射,我认为它是有效的。谢谢你,Jose!你说得对。我需要在ko循环中使用$rawData而不是$data。再次感谢!
var mapping = {
        'AltNames': {
                create: function(options) {
                        return ko.observable(options.data);
                }
        }
}

ko.mapping.fromJS(data, mapping, this);