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

Function trackValueOnNode

code/new-context-api/public/app.js:3124–3169  ·  view source on GitHub ↗
(node)

Source from the content-addressed store, hash-verified

3122}
3123
3124function trackValueOnNode(node) {
3125 var valueField = isCheckable(node) ? 'checked' : 'value';
3126 var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
3127
3128 var currentValue = '' + node[valueField];
3129
3130 // if someone has already defined a value or Safari, then bail
3131 // and don't track value will cause over reporting of changes,
3132 // but it's better then a hard failure
3133 // (needed for certain tests that spyOn input values and Safari)
3134 if (node.hasOwnProperty(valueField) || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {
3135 return;
3136 }
3137
3138 Object.defineProperty(node, valueField, {
3139 configurable: true,
3140 get: function () {
3141 return descriptor.get.call(this);
3142 },
3143 set: function (value) {
3144 currentValue = '' + value;
3145 descriptor.set.call(this, value);
3146 }
3147 });
3148 // We could've passed this the first time
3149 // but it triggers a bug in IE11 and Edge 14/15.
3150 // Calling defineProperty() again should be equivalent.
3151 // https://github.com/facebook/react/issues/11768
3152 Object.defineProperty(node, valueField, {
3153 enumerable: descriptor.enumerable
3154 });
3155
3156 var tracker = {
3157 getValue: function () {
3158 return currentValue;
3159 },
3160 setValue: function (value) {
3161 currentValue = '' + value;
3162 },
3163 stopTracking: function () {
3164 detachTracker(node);
3165 delete node[valueField];
3166 }
3167 };
3168 return tracker;
3169}
3170
3171function track(node) {
3172 if (getTracker(node)) {

Callers 1

trackFunction · 0.70

Calls 2

isCheckableFunction · 0.70
detachTrackerFunction · 0.70

Tested by

no test coverage detected