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

Function trackValueOnNode

code/one-direction-data-flow/public/app.js:3636–3681  ·  view source on GitHub ↗
(node)

Source from the content-addressed store, hash-verified

3634}
3635
3636function trackValueOnNode(node) {
3637 var valueField = isCheckable(node) ? 'checked' : 'value';
3638 var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);
3639
3640 var currentValue = '' + node[valueField];
3641
3642 // if someone has already defined a value or Safari, then bail
3643 // and don't track value will cause over reporting of changes,
3644 // but it's better then a hard failure
3645 // (needed for certain tests that spyOn input values and Safari)
3646 if (node.hasOwnProperty(valueField) || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {
3647 return;
3648 }
3649
3650 Object.defineProperty(node, valueField, {
3651 configurable: true,
3652 get: function () {
3653 return descriptor.get.call(this);
3654 },
3655 set: function (value) {
3656 currentValue = '' + value;
3657 descriptor.set.call(this, value);
3658 }
3659 });
3660 // We could've passed this the first time
3661 // but it triggers a bug in IE11 and Edge 14/15.
3662 // Calling defineProperty() again should be equivalent.
3663 // https://github.com/facebook/react/issues/11768
3664 Object.defineProperty(node, valueField, {
3665 enumerable: descriptor.enumerable
3666 });
3667
3668 var tracker = {
3669 getValue: function () {
3670 return currentValue;
3671 },
3672 setValue: function (value) {
3673 currentValue = '' + value;
3674 },
3675 stopTracking: function () {
3676 detachTracker(node);
3677 delete node[valueField];
3678 }
3679 };
3680 return tracker;
3681}
3682
3683function track(node) {
3684 if (getTracker(node)) {

Callers 1

trackFunction · 0.70

Calls 2

isCheckableFunction · 0.70
detachTrackerFunction · 0.70

Tested by

no test coverage detected