SmartGWT 4p nightly; SmartClient Version: v9.0p_2014-01-01/LGPL Development Only (built 2014-01-01)
Chromium Version 31.0.1650.63 Ubuntu 12.04 (31.0.1650.63-0ubuntu0.12.04.1~20131204.1)
I have a data source that contains an array of nested objects that contain dates.
Ex:
Calls to ValuesManager.valuesHaveChanged() always returns true, even if no changes were made. I tracked down the cause to the following in ISC_Forms.js:
For some reason SC only does a primitive != comparison for objects in a nested array. If I change this to the following:
then it appears to work correctly. Can you explain the reason for this?
Chromium Version 31.0.1650.63 Ubuntu 12.04 (31.0.1650.63-0ubuntu0.12.04.1~20131204.1)
I have a data source that contains an array of nested objects that contain dates.
Ex:
Code:
{id: 1, name: "parentObject", items: [{id: 1, name: "nested", effectiveDate=Mon Jan 20 12:00:00 GMT-500 2014}, {id: 2, name: "another nested object", effectiveDate=Mon Jan 20 12:00:00 GMT-500 2014}]}
Code:
compareValues : function (value1, value2) { if (value1 == value2) return true; if (isc.isA.Date(value1) && isc.isA.Date(value2)) return (Date.compareDates(value1, value2) == 0); else if (isc.isAn.Array(value1) && isc.isAn.Array(value2)) { if (value1.length != value2.length) return false; for (var i = 0; i < value1.length; i++) { if (!isc.DynamicForm.compareValues(value1[i], value2[i])) return false; } return true; } else { // handle having values set to Number, String etc instance // IE var foo = new Number(2); rather than just var foo = 2; // This returns true for isA.Object() if (isc.isA.Number(value1) || isc.isA.String(value1) || isc.isA.Boolean(value1)) { value1 = value1.valueOf(); } if (isc.isA.Number(value2) || isc.isA.String(value2) || isc.isA.Boolean(value2)) { value2 = value2.valueOf(); } if (value1 == value2) return true; if (isc.isAn.Object(value1) && isc.isAn.Object(value2)) { var tempObj = isc.addProperties({}, value2); for (var attr in value1) { // We're doing a simple == comparison here - won't handle // complex (Object, Date, Array) attribute values if (value2[attr] != value1[attr]) return false; <-- this line here delete tempObj[attr]; } // tempObj should now be empty if they match for (var attr in tempObj) { return false; } return true; } } return false; },
Code:
if (!isc.DynamicForm.compareValues(value1[attr], value2[attr])) return false;
Comment