Javascript js映射忽略
我们正在使用.NETMVC4上的knockout.js和knockout.mapping.js。假设我有这样的JSON:Javascript js映射忽略,javascript,jquery,knockout.js,knockout-mapping-plugin,jquery-select2,Javascript,Jquery,Knockout.js,Knockout Mapping Plugin,Jquery Select2,我们正在使用.NETMVC4上的knockout.js和knockout.mapping.js。假设我有这样的JSON: { "deliveryPointType": "0", "deliveryPointTypes": [ { "id": 0, "text": "Pridėti rankiniu būdu" }, { "id": 1,
{
"deliveryPointType": "0",
"deliveryPointTypes": [
{
"id": 0,
"text": "Pridėti rankiniu būdu"
},
{
"id": 1,
"text": "Siųsti visiems regiono objektams"
}
],
"showRegionSelection": false,
"showDeliveryPointSelection": true,
"regionId": "",
"userHasRegions": "False",
"propertyNames": {
"deliveryPointTypeName": "Pridėti rankiniu būdu"
},
"initialMaterials": [
{
"quantity": 0,
"materialTypeId": "",
"propertyNames": {},
"validMaterial": true,
"showMaterialError": false,
"materialTypeAjax": {
"quietMillis": 300,
"cache": false,
"dataType": "json",
"type": "GET",
"url": "/lt-LT/Material/MaterialTypeNameLookup"
}
}
],
"deliveryBuildings": [
{
"clientId": "1",
"buildingId": "1",
"regionId": "",
"newBuilding": false,
"validClient": true,
"validBuilding": true,
"validRegion": true,
"showClientError": false,
"showBuildingError": false,
"showRegionError": false,
"propertyNames": {
"clientName": "klientas",
"buildingName": "ASD project, Antagynės gatvė, Kaunas, Lietuvos Respublika"
},
"clientAjax": {
"quietMillis": 300,
"cache": false,
"dataType": "json",
"type": "GET",
"url": "/lt-LT/Task/PayerLookup"
},
"buildingAjax": {
"quietMillis": 300,
"cache": false,
"dataType": "json",
"type": "GET",
"url": "/lt-LT/Object/GetClientAddressListByQuery"
},
"regionAjax": {
"quietMillis": 300,
"cache": false,
"dataType": "json",
"type": "GET",
"url": "/lt-LT/Object/RegionNameLookup"
}
}
],
"hasNewBuildings": false,
"showBuildingValidation": false,
"showMinimumBuildingRequiredValidation": false,
"showMaterialValidation": false,
"validRegion": true,
"showRegionError": false,
"regionAjax": {
"quietMillis": 300,
"cache": false,
"dataType": "json",
"type": "GET",
"url": "/lt-LT/Object/RegionNameLookup"
}
}
表单提交失败如果服务中出现错误/无效,将使用以前的值重新填充。我们使用$BuildingsJSON.valko.mapping.toJSONviewModel.deliveryBuildings将表单submit上的ViewModel转换为JSON
在表单重新填充方面,我们使用ko.mapping.fromJSONdeliveryBuildings、mapping、viewModel.deliveryBuildings解析JSON;映射现在只是一个空对象,没有运气
我们使用select2字段从使用ajax的列表中选择建筑物的地址。事实是,fromJSON将几乎所有json属性填充为可观察的,我不需要。在选择2 open时,我们会收到一个异常:
未捕获类型错误:对象函数可观察{
如果arguments.length>0{
//写
// Ignore writes if the value hasn't changed
if (!observable['equalityComparer'] || !observable['equalityComparer'](_latestValue, arguments[0])) {
observable.valueWillMutate();
_latestValue = arguments[0];
if (DEBUG) observable._latestValue = _latestValue;
observable.valueHasMutated();
}
return this; // Permits chained assignments
}
else {
// Read
ko.dependencyDetection.registerDependency(observable); // The caller only needs to be notified of changes if they did a "read"
操作
返回最新值;
}
}没有“toUpperCase”方法
我已经调试了它在什么地方中断了ajax调用的类型属性。我认为我们需要将ajax属性从强制转换中排除到observable
所以,问题是:我们怎么能不将特定物体的特定属性投射到可观察的物体上呢?使用mapping plugin是否足够,是否需要额外的插件,或者甚至是不可能的?您是否考虑过在映射绑定中使用copy关键字?这只是将值复制到js属性中,而不是使其成为可观察的 从:
谢谢,我试试看。还有-这可以复制整个对象吗?嗯,它仍然可以将属性转换为可观察的。你能给我看一下你在这方面使用的代码吗,因为我使用了copy,它工作得很好。另外,如果你想复制整个对象,那么你为什么要首先映射它?谢谢你建议使用copy。它终于按预期工作了。至于我们为什么要绘制地图,我不知道。我自己是新手,可能会犯一些愚蠢的错误。
var mapping = {
'copy': ["propertyToCopy"]
}
ko.mapping.fromJS(data, mapping, viewModel);