【发布时间】:2014-09-16 23:48:15
【问题描述】:
我的一个 Rails 视图中有一段可怕的 jQuery 代码,它监听一个看起来像这样的事件:
<% user_request_file = params[:file] == document.id.to_s %>
<% if user_request_file %>
<script type="text/javascript">
$(document).ready(function() {
$("#generate_file_btn_for_<%= document.id %>").attr('disabled', 'disabled').attr("href", "#").attr('title', 'Loading file...');
var doc_modal_<%= document.id %> = setInterval(function() {
$.getJSON( "<%= file_xhr_document_path(document) %>", function(file) {
if (file.file_generated) {
$("#loading_for_<%= document.id %>").fadeOut( "slow");
$('#document_file_modal_<%= document.id %>').modal('show');
$("#file_url_download_link_<%= document.id %>").attr("href", file.file_url);
clearInterval(doc_modal_<%= document.id %>);
} else if (file.file_error != null) {
window.location.href = "<%= file_error_document_path(document) %>";
}
});
}, 2000);
});
</script>
<% end %>
我想用更模块化和重构友好的东西来替换它。上面的代码每两秒侦听一次发送到其服务器的请求,如果已发送,视图将使用来自该请求的信息进行响应。
Flight 已被推荐给我作为合适的替代框架,但我真的不知道如何开始重构它。任何建议甚至是其他框架的建议都会很棒。
【问题讨论】:
-
第一步是将 JavaScript 从模板/文本替换上下文中拉出——这同样适用于移动到 Flight 或 KO 或其他任何东西——以便它可以被视为自己的/独立模块。虽然在不同的环境下,我提供了an example here。关键是 JavaScript 被隔离在相关 API 后面,并且提供了值。
标签: javascript jquery ruby-on-rails ruby-on-rails-3