Support

Account

Home Forums Backend Issues (wp-admin) Unnecessary AJAX-calls Reply To: Unnecessary AJAX-calls

  • I’ve come up with a rudimentary patch to input.js that solves the excessive $.each() and $el.closest() calls when there is an excessive amount of repeatables.

    changing this:

    		get_visibility : function( $target, rule ){
    			
    			//console.log( 'conditional_logic.get_visibility(%o, %o)', $target, rule );
    			
    			// update cache (cache is cleared after render_fields)
    			if( !acf.isset(this.cache, rule.field) ) {
    				
    				//console.log('get_fields(%o)', rule.field);
    				
    				// get all fields for this field_key and store in cache
    				this.cache[ rule.field ] = acf.get_fields(rule.field, false, true);
    				
    			}
    			
    			
    			// vars
    			var $triggers = this.cache[ rule.field ],
    				$trigger = null;
    			
    			
    			// bail early if no triggers found
    			if( !$triggers.exists() ) {
    				
    				return false;
    				
    			}
    			
    			
    			// set $trigger
    			$trigger = $triggers.first();
    			
    			
    			// find better $trigger
    			if( $triggers.length > 1 ) {
    				
    				$triggers.each(function(){
    					
    					// vars
    					$parent = $(this).parent();
    					
    					
    					if( $target.closest( $parent ).exists() ) {
    						
    						$trigger = $(this);
    						return false;
    					}
    
    				});
    				
    			}
    			
    			
    			// calculate
    			var visibility = this.calculate( rule, $trigger, $target );
    			
    			
    			// return
    			return visibility;
    		},

    To this:

    		get_visibility : function( $target, rule ){
    			
    			//console.log( 'conditional_logic.get_visibility(%o, %o)', $target, rule );
    			
    			// update cache (cache is cleared after render_fields)
    			if( !acf.isset(this.cache, rule.field) ) {
    				
    				//console.log('get_fields(%o)', rule.field);
    				
    				// get all fields for this field_key and store in cache
    				this.cache[ rule.field ] = acf.get_fields(rule.field, false, true);
    				
    			}
    			
    			
    			// vars
    			var $triggers = this.cache[ rule.field ],
    /*change*/		$trigger  = $target.closest('.acf-row').find('tr.field_key-'+rule.field);
    			
    			
    			// bail early if no triggers found
    			if( !$triggers.exists() ) {
    				
    				return false;
    				
    			}
    /*change*/	else if ( !$trigger.exists() ) {			
    			
    				// set $trigger
    				$trigger = $triggers.first();
    				
    				
    				// find better $trigger
    				if( $triggers.length > 1 ) {
    					
    					$triggers.each(function(){
    						
    						// vars
    						$parent = $(this).parent();
    						
    						
    						if( $target.closest( $parent ).exists() ) {
    							
    							$trigger = $(this);
    							return false;
    						}
    
    					});
    					
    				}
    
    			}
    			
    			
    			// calculate
    			var visibility = this.calculate( rule, $trigger, $target );
    			
    			
    			// return
    			return visibility;
    		}