93 lines
3.0 KiB
JavaScript
93 lines
3.0 KiB
JavaScript
'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.default = bindAutoBindMethods;
|
|
/**
|
|
* Copyright 2013-2015, Facebook, Inc.
|
|
* All rights reserved.
|
|
*
|
|
* This source code is licensed under the BSD-style license found in the
|
|
* LICENSE file in the root directory of React source tree. An additional grant
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
*
|
|
* Original:
|
|
* https://github.com/facebook/react/blob/6508b1ad273a6f371e8d90ae676e5390199461b4/src/isomorphic/classic/class/ReactClass.js#L650-L713
|
|
*/
|
|
|
|
function bindAutoBindMethod(component, method) {
|
|
var boundMethod = method.bind(component);
|
|
|
|
boundMethod.__reactBoundContext = component;
|
|
boundMethod.__reactBoundMethod = method;
|
|
boundMethod.__reactBoundArguments = null;
|
|
|
|
var componentName = component.constructor.displayName,
|
|
_bind = boundMethod.bind;
|
|
|
|
boundMethod.bind = function (newThis) {
|
|
var args = Array.prototype.slice.call(arguments, 1);
|
|
if (newThis !== component && newThis !== null) {
|
|
console.warn('bind(): React component methods may only be bound to the ' + 'component instance. See ' + componentName);
|
|
} else if (!args.length) {
|
|
console.warn('bind(): You are binding a component method to the component. ' + 'React does this for you automatically in a high-performance ' + 'way, so you can safely remove this call. See ' + componentName);
|
|
return boundMethod;
|
|
}
|
|
|
|
var reboundMethod = _bind.apply(boundMethod, arguments);
|
|
reboundMethod.__reactBoundContext = component;
|
|
reboundMethod.__reactBoundMethod = method;
|
|
reboundMethod.__reactBoundArguments = args;
|
|
|
|
return reboundMethod;
|
|
};
|
|
|
|
return boundMethod;
|
|
}
|
|
|
|
function bindAutoBindMethodsFromMap(component) {
|
|
for (var autoBindKey in component.__reactAutoBindMap) {
|
|
if (!component.__reactAutoBindMap.hasOwnProperty(autoBindKey)) {
|
|
return;
|
|
}
|
|
|
|
// Tweak: skip methods that are already bound.
|
|
// This is to preserve method reference in case it is used
|
|
// as a subscription handler that needs to be detached later.
|
|
if (component.hasOwnProperty(autoBindKey) && component[autoBindKey].__reactBoundContext === component) {
|
|
continue;
|
|
}
|
|
|
|
var method = component.__reactAutoBindMap[autoBindKey];
|
|
component[autoBindKey] = bindAutoBindMethod(component, method);
|
|
}
|
|
}
|
|
|
|
function bindAutoBindMethods(component) {
|
|
if (component.__reactAutoBindPairs) {
|
|
bindAutoBindMethodsFromArray(component);
|
|
} else if (component.__reactAutoBindMap) {
|
|
bindAutoBindMethodsFromMap(component);
|
|
}
|
|
}
|
|
|
|
function bindAutoBindMethodsFromArray(component) {
|
|
var pairs = component.__reactAutoBindPairs;
|
|
|
|
if (!pairs) {
|
|
return;
|
|
}
|
|
|
|
for (var i = 0; i < pairs.length; i += 2) {
|
|
var autoBindKey = pairs[i];
|
|
|
|
if (component.hasOwnProperty(autoBindKey) && component[autoBindKey].__reactBoundContext === component) {
|
|
continue;
|
|
}
|
|
|
|
var method = pairs[i + 1];
|
|
|
|
component[autoBindKey] = bindAutoBindMethod(component, method);
|
|
}
|
|
} |