MCPcopy Create free account
hub / github.com/krasimir/react-in-patterns / trackValueOnNode

Function trackValueOnNode

code/controlled-uncontrolled/public/app.js:3087–3132  ·  view source on GitHub ↗
(node)

Source from the content-addressed store, hash-verified

3085}
3086
3087function trackValueOnNode(node) {
3088 var valueField = isCheckable(node) ? 'checked' : 'value';
3089 var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
3090
3091 var currentValue = '' + node[valueField];
3092
3093 // if someone has already defined a value or Safari, then bail
3094 // and don't track value will cause over reporting of changes,
3095 // but it's better then a hard failure
3096 // (needed for certain tests that spyOn input values and Safari)
3097 if (node.hasOwnProperty(valueField) || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {
3098 return;
3099 }
3100
3101 Object.defineProperty(node, valueField, {
3102 configurable: true,
3103 get: function () {
3104 return descriptor.get.call(this);
3105 },
3106 set: function (value) {
3107 currentValue = '' + value;
3108 descriptor.set.call(this, value);
3109 }
3110 });
3111 // We could've passed this the first time
3112 // but it triggers a bug in IE11 and Edge 14/15.
3113 // Calling defineProperty() again should be equivalent.
3114 // https://github.com/facebook/react/issues/11768
3115 Object.defineProperty(node, valueField, {
3116 enumerable: descriptor.enumerable
3117 });
3118
3119 var tracker = {
3120 getValue: function () {
3121 return currentValue;
3122 },
3123 setValue: function (value) {
3124 currentValue = '' + value;
3125 },
3126 stopTracking: function () {
3127 detachTracker(node);
3128 delete node[valueField];
3129 }
3130 };
3131 return tracker;
3132}
3133
3134function track(node) {
3135 if (getTracker(node)) {

Callers 1

trackFunction · 0.70

Calls 2

isCheckableFunction · 0.70
detachTrackerFunction · 0.70

Tested by

no test coverage detected