У меня действительно нубский вопрос о виджетах ajax. Это действительно расширение вопроса, который я задал некоторое время назад: виджеты ajax в пирамиде и хамелеоне< /а>
Если вы посмотрите на этот вопрос и содержимое файла account_login_widget.pt, вы увидите, что «виджет» использует такой синтаксис, как ${username}. Это снова работает для виджета входа в систему, который всегда есть только один на странице, но все рушится, пытаясь использовать этот «шаблон виджета» для виджетов, которые могут существовать несколько раз на странице.
Теперь я хочу создать кнопку переключения ajax. Кнопка должна быть настраиваемой: текст кнопки может меняться в зависимости от страницы, на которой она используется, и код обратного вызова тоже должен быть изменен... опять же в зависимости от страницы. Кроме того, на одной странице должно быть несколько кнопок-переключателей.
2 вопроса:
Допустим, у меня есть список ресторанов на моей странице и кнопка «Нравится» рядом с каждым. Каков правильный способ передачи идентификатора ресторана на вызов почтового сервера (например: как вы передаете переменные в виджет javascript?).
Допустим, на той же странице я хочу использовать тот же виджет кнопки переключения ajax, но в другом контексте. Скажем, на той же странице у меня также есть список людей, и я хочу «подписаться» на них. Как правильно передать текстовую переменную кнопки в виджет, а также изменить поведение вызова почтового сервера? (то есть: в вопросе 1, возможно, я хочу вызвать restaurant.like(), но в вопросе 2 я хочу вызвать person.follow()
Вот пример кода, показывающий виджет...
<script type="text/javascript">
// plugin implementation
(function($) {
$.fn.create_ajax_toggle_button = function(csrf, name, toggle_on, url, on_text, off_text) {
return this.each(function() {
var anchor = $('<a></a>');
anchor.appendTo(this);
$(anchor).button();
$(anchor).toggle_ajax_button_text(toggle_on, on_text, off_text);
$(anchor).click(function(e) {
var form_data = '_csrf=' + csrf + '&name=' + name + '&toggle_on=' + toggle_on;
$.post(url, form_data, function(response) {
$.fn.toggle_ajax_button_text();
});
});
});
};
$.fn.toggle_ajax_button_text = function(toggle_on, on_text, off_text) {
if (toggle_on == 'True') {
$(this).toggleClass('ui-state-active');
$(this).text(on_text);
} else {
$(this).text(off_text);
}
};
})(jQuery);
// Define the entry point
$(document).ready(function() {
// YUCK!!! I really shouldn't be/can't using ${name} templating
// syntax like this. Doing this means the JS code needs to be
// loaded over and over again for each item in the list. This
// just doesn't work. :-(
$('.ajax_toggle_button_div_${name}').create_ajax_toggle_button('${csrf}', '${name}', '${toggle_on}', '${url}', '${on_text}', '${off_text}');
});
</script>
<div class="ajax_toggle_button_div_${name}"></div>
Спасибо!