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 to share
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 to share