Я хочу выполнить функцию обратного вызова внутри объекта. Я не знаю, что-то не так в том, как я это делаю.Выполнение функции обратного вызова внутри объекта javascript
Я искал решение для Google, также искал в stackoverflow, но не смог найти ничего похожего на то, как я это кодирую.
PHPGateway.js
var PHPGateway = {
opt_friendlyURL: true,
opt_folder: 'ajax/',
callback_function: null,
useFriendlyURL: function (bool) {
this.opt_friendlyURL = bool;
},
setFolder: function (folder) {
this.opt_folder = folder;
},
send: function (service, method, data, callback) {
var url,
json_data = {};
if (this.opt_friendlyURL) {
url = this.opt_folder + service + '/' + method;
} else {
url = this.opt_folder + 'gateway.php?c=' + service + '&m=' + method;
}
if (data != undefined) {
json_data = JSON.stringify(data);
}
this.callback_function = (callback == undefined) ? null : callback;
$.ajax({
method: 'POST',
url: url,
data: {data: json_data},
success: this.ajax_success,
error: this.ajax_error
});
},
ajax_success: function (returned_object) {
if (this.callback_function != null) {
this.callback_function(returned_object.error, returned_object.data);
}
},
ajax_error: function() {
this.callback_function.call(false, {});
}
};
Затем внутри HTML-файл, который загружает PHPGateway.js, я следующий код:
<script>
function submit_handler(event) {
event.preventDefault();
form_submit();
}
function form_callback(error, data) {
if(error == null) {
alert(data.text);
}
}
function form_submit() {
var data = {
status: $('#inStatus').val(),
amount: $('#inAmount').val(),
id: $('#inBudgetID'). val()
}
PHPGateway.send('budget', 'status', data, form_callback);
}
$('form').one('submit', submit_handler);
</script>
Я получаю сообщение об ошибке на this.callback_function(returned_object.error, returned_object.data);
, ошибка is Uncaught TypeError: Object # не имеет метода 'callback_function'.
- Что я делаю неправильно?
- Это лучший способ сделать это?
Thank you!
Основываясь на ответе minitech, я обновил PHPGateway.js следующим образом. Я пропустил те части, которые не были обновлены.
var PHPGateway = {
// Omitted code
send: function (service, method, data, callback) {
var url,
json_data = {},
that = this;
if (this.opt_friendlyURL) {
url = this.opt_folder + service + '/' + method;
} else {
url = this.opt_folder + 'gateway.php?c=' + service + '&m=' + method;
}
if (data != undefined) {
json_data = JSON.stringify(data);
}
this.callback_function = (callback == undefined) ? null : callback;
$.ajax({
method: 'POST',
url: url,
data: {data: json_data},
success: function(data, textStatus, jqXHR) {
that.ajax_success(data, textStatus, jqXHR);
},
error: function(jqXHR, textStatus, errorThrown) {
that.ajax_error(jqXHR, textStatus, errorThrown);
}
});
},
ajax_success: function (data, textStatus, jqXHR) {
if (this.callback_function != null) {
this.callback_function(true, data.data);
}
},
ajax_error: function (jqXHR, textStatus, errorThrown) {
this.callback_function.call(false, {});
}
};
Теперь это работает !!!
Это, кажется, работает отлично для меня. Является ли этот код посреди другого кода? –
Да, это прекрасно работает. Ваша проблема в другом месте. Что касается «наилучшего способа», то это основано на мнениях. –
Это должно работать нормально. Возможно, вы используете метод какого-либо другого объекта как 'myCallbackFunction', и он вызывает подобную ошибку при вызове, но не тот же? (Или, может быть, это тот же самый, и вы на самом деле делаете какую-то рекурсивную вещь?) – Ryan