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);
 | 
						|
  }
 | 
						|
} |