JS function for coffeescript, with jQuery.map and Selectors as param

I am refactoring JS code for CoffeeScript and have a function problem.

This is the JS that works:

$(".comformt_QA").change(function(){
   var array = $(".comformt_QA").map(function() {
      return $(this).val();
   }).toArray();

   $("[name='comfort_qualitative_assessment.global_comfort_index']").val(
      calc_qualitative_assessment_array(array)
   ).change();
});

      

My goal is to use this snipplet as a function and be able to call:

class_to_calc_qualitative_assessment_array(".comformt_QA", "[name='comfort_qualitative_assessment.global_comfort_index']");

      

Here's CoffeeScript:

@class_to_calc_qualitative_assessment_array = (class_param, target) ->
   array = []
   $(class_param).change ->
      array = $(class_param).map( ->
         $(this).val()
      )
   $(target).val(calc_qualitative_assessment_array(array)).change()

      

array is always empty ... Thoughts?

+3


source to share


2 answers


Ha finally found 2 problems and their solution:

  • I'm not sure why, but in CS you need .get before .map (in JS it is not needed)
  • For some reason, I couldn't use $ (@). val () like in JS even with fat arrow


Working code:

@class_to_calc_qualitative_assessment_array = (class_param, target) ->
   array = []
   $(class_param).change =>
      array = $(class_param).get().map( (item) ->
         $(item).val()
      )
      $(target).val(calc_qualitative_assessment_array(array)).change()
   return

      

-1


source


If you compile your coffee code to Javascript, this is the output:

this.class_to_calc_qualitative_assessment_array = function(class_param, target) {
  var array;
  array = [];
  $(class_param).change(function() {
    return array = $(class_param).map(function() {
      return $(this).val();
    });
  });
  return $(target).val(calc_qualitative_assessment_array(array)).change();
}; 

      

Coffeescript translates @

to a keyword this

in JS. Also you have no return inside your function - this causes coffeescript to return the last assigned function value.

Maybe this would be a working approach:



class_to_calc_qualitative_assessment_array = (class_param, target) ->
   array = []
   $(class_param).change ->
      array = $(class_param).map( ->
         $(@).val()
      )
      return
   $(target).val(calc_qualitative_assessment_array(array)).change()
   return

      

Transpiled looks like this:

var class_to_calc_qualitative_assessment_array;

class_to_calc_qualitative_assessment_array = function(class_param, target) {
  var array;
  array = [];
  $(class_param).change(function() {
    array = $(class_param).map(function() {
      return $(this).val();
    });
  });
  $(target).val(calc_qualitative_assessment_array(array)).change();
};

      

0


source







All Articles