From e23e490b99e295ef5b61fb5fa81f6ff68cb4d69b Mon Sep 17 00:00:00 2001 From: chrisala Date: Thu, 4 Jan 2024 14:49:34 +1100 Subject: [PATCH] Only pre-pop fields that exist in the result #219 --- .../javascripts/forms-knockout-bindings.js | 23 ++++++++++++------- .../example_models/behavioursExample.json | 11 +-------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/grails-app/assets/javascripts/forms-knockout-bindings.js b/grails-app/assets/javascripts/forms-knockout-bindings.js index 5707d60..8cf8993 100644 --- a/grails-app/assets/javascripts/forms-knockout-bindings.js +++ b/grails-app/assets/javascripts/forms-knockout-bindings.js @@ -1207,16 +1207,23 @@ if (!target) { throw "Unable to locate target for pre-population: "+target; } - if (_.isFunction(target.loadData)) { - target.loadData(data); - } else if (_.isFunction(target.load)) { - target.load(data); - } else if (ko.isObservable(target)) { - target(data); - } else { - console.log("Warning: target for pre-populate is invalid"); + target = target.data || target; + for (var prop in data) { + if (target.hasOwnProperty(prop)) { + var propTarget = target[prop]; + if (_.isFunction(propTarget.loadData)) { + propTarget.loadData(data[prop]); + } else if (_.isFunction(propTarget.load)) { + propTarget.load(data[prop]); + } else if (ko.isObservable(propTarget)) { + propTarget(data[prop]); + } else { + console.log("Warning: target for pre-populate is invalid"); + } + } } + }); // This is a computed rather than a pureComputed as it has a side effect. }); } diff --git a/grails-app/conf/example_models/behavioursExample.json b/grails-app/conf/example_models/behavioursExample.json index d588fa5..ec48ab3 100644 --- a/grails-app/conf/example_models/behavioursExample.json +++ b/grails-app/conf/example_models/behavioursExample.json @@ -45,11 +45,6 @@ "name": "param", "type": "computed", "expression": "item5" - }, - { - "name": "item5", - "type": "computed", - "expression": "item5" } ] }, @@ -57,10 +52,6 @@ { "source-path": "param", "target": "item6" - }, - { - "source-path": "item5", - "target": "item5" } ], "target": "$data" @@ -119,7 +110,7 @@ "items": [ { "type": "literal", - "source": "Note for this example, data entered into item5 will trigger a pre-pop call and be mapped back to item5 and item6. Note that the target of the pre-pop is $data which is the current binding context (or the root object in this case). A current limitation is the load method is used, which means if the pre-pop result does not contain keys for all data in the target object, the data for missing fields will be set to undefined. A planned enhancement is to only replace data where keys in the pre-pop data exist." + "source": "Note for this example, data entered into item5 will trigger a pre-pop call and be mapped back to item6. Note that the target of the pre-pop is $data which is the current binding context (or the root object in this case). A current limitation is the load method is used for all keys in the returned data, which means if the data is nested and the pre-pop result does not contain keys for all nested data in the nested target object, the data for missing fields will be set to undefined." } ] }