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