I’m using this code:
$newFilter = getNewFilter();
$fieldDropdown = getFieldDropdown(fieldData.field);
$newFilter.append($fieldDropdown);
$typeDropdown = getTypeDropdown($fieldDropdown.data('zenfilter').fieldId, $fieldDropdown.val(), fieldData.type);
$newFilter.append($typeDropdown);
$inputBox = getInputBox($typeDropdown.data('zenfilter').fieldId, $typeDropdown.data('zenfilter').fieldType, $typeDropdown.val(), fieldData.value);
$newFilter.append($inputBox);
And I get a error ($fieldDropdown.data("zenfilter") is null) on the fourth line ($typeDropdown = getTypeDropdown...). This is because the getFieldDropdown didn’t finished execution yet. How can I call the functions lineally? Thanks a lot.
Edit: Added the getFieldDropdown function:
getFieldDropdown = function (populateData) {
var $hiddenInput, i, $obj;
$hiddenInput = $('<input>', {
name: defaults.paramName + '[' + nFilters + '][field]',
type: 'hidden'
});
$obj = $('<select></select>', {
'class': classesHash.individualField,
name: defaults.paramName + '[' + nFilters + '][fakefield]'
}).
data('zenfilter', { fieldId: nFilters }).
addOption(fieldOptions).
sortOptions(true).
selectOptions('').
change(function(){
$(this).nextAll('select, div.' + classesHash.individualInputContainer).detach();
$(this).removeClass(classesHash.incompleteField).after(getTypeDropdown($(this).data('zenfilter').fieldId, $(this).val()));
$(this).prev('input[type=hidden]').val(defaults.data[$(this).val()].fieldname);
});
if (populateData) {
for (i = 0; i < defaults.data.length; i += 1) {
if (defaults.data[i].fieldname === populateData) {
$obj.selectOptions(String(i));
}
}
}
return $hiddenInput.add($obj);
};
(addOptions, sortOptions and selectOptions are just a plugin’s methods to manipulate selects easier, they don’t do any AJAX)
Those functions are called synchronously. What’s most likely happening is that
getFieldDropdown(fieldData.field)is returning null, or the object that it returns doesn’t have thezenfilterproperty defined internally.