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);