Итак, я разработчик java, пытаясь не писать слишком много java-кода в javascript. Я читал различные ресурсы о javascript (например, http://chimera.labs.oreilly.com/books/1234000000262/ch04.html), но я до сих пор не могу понять, как аккуратный и хороший способ сделать это правильно.Использование объектов в качестве обработчиков событий
Таким образом, основная проблема заключается в:
- нажмите «Удалить» кнопка (там будет много удаления кнопок на странице)
- открытого диалога начальной загрузки модальных, который является шаблоном Underscore
- связывает действия кнопкам
- если нормально нажата, сделать Ajax запрос
таким образом, это решение, которое работает частично до сих пор. У меня возникают проблемы с вызовами функций из обратного вызова успеха ajax. Если я попытаюсь использовать «это», у него неправильный контекст. Я мог бы, вероятно, сохранить это в другой переменной (например, «это»), но это определенно было бы неплохо.
Кроме того, я не совсем уверен, что этот код выглядит, что хорошо, учитывая то, что я прочитал в упомянутой выше книге
function DeleteHandler() {
var obj = {
init: function() {
_.bindAll(this, 'render', 'close', 'submit');
this.$main = $('#main');
// get underscore template
this._template = _.template($('#delete-template').html());
// bind function to delete button
this.$main.on('click', '.delete', this.render);
},
render: function(e) {
e.preventDefault();
//render the template and bind button actions
this.$content = $(this._template({title: 'moe'}));
this.$content.on('click', '.ok', this.submit);
this.$content.modal('show');
this.$endpoint = $(e.target).attr('endpoint');
},
close: function() {
this.$content.modal('hide');
},
submit: function() {
$.ajax({
url: this.$endpoint,
type: 'DELETE',
success: function(data,textStatus){
// call close function here! but how?!?
},
});
}
}
return obj;
};
Теперь я могу использовать что-то вроде этого
<span class="delete" endpoint='http://....'>delete</span>
<script type="text/javascript">
$(function($) {
DeleteHandler().init();
});
</script>
Я бы на самом деле если бы я мог просто позвонить по моей функции следующим образом:
DeleteHandler.init();
это возможно? Я буду использовать эту функцию несколько раз на странице, поэтому я не могу просто использовать литерал вместо функции.
редактировать: я нашел какой-то обходной путь, чтобы сделать Ajax обратного вызова произойдет: Вы можете передать контекст для JQuery Ajax буквальным:
Если я использую что-то вроде этого:
$.ajax({
url: this.$endpoint,
type: 'DELETE',
context: this,
success: function(data,textStatus){this.$update.html(data); this.close();},
}
Я могу называть this.close() в обратном вызове. Наверное, это не очень хорошее решение. Но, возможно, у кого-то есть лучшая идея?
Этот вопрос кажется не по теме, потому что речь идет о Code Refactoring, который должен быть включен http://codereview.stackexchange.com/. – Claudiu
Это не рефакторинг кода. Я пытаюсь найти хорошее решение конкретной проблемы. Я предложил то, что у меня есть до сих пор, чтобы легче понять и указать конкретные моменты. Этот вопрос будет работать без моего образца кода, но для этого потребуется гораздо больше усилий. Но, вероятно, страница codereview - хорошее место для таких вопросов. –
Поскольку вы используете jQuery, один из способов - создать плагин (начать с ссылок в [здесь] (http://learn.jquery.com/plugins/)). Существуют и другие способы сделать то, что вы уже сделали, например, переместить код init в функцию-конструктор, а другие методы в 'TheConstructor.prototype.methodName', а затем запустить с помощью' new TheConstructor (args) '. Какой метод вы выбираете для реализации «псевдокласса», отчасти является вопросом стиля. Возможно, вы могли бы дать более подробную информацию о том, почему ваш текущий код не «чувствует себя хорошо». – bfavaretto