Alb*_*ini 6 javascript ruby-on-rails dry unobtrusive-javascript coffeescript
我有一个应用程序,它使用一些Javascript来执行基本的Ajax请求,例如自动完成和实时搜索.例如,我通过以下方式实现了实时搜索; 我发现了一些潜在的问题,并希望与您讨论这个问题,以便有更好的代码.
应用程序/控制器/ company_controller.rb
def livesearch
@companies = Company.search(params[:query])
render :partial => "companies", :locals => {:companies => @companies}
end
Run Code Online (Sandbox Code Playgroud)
应用程序/视图/公司/ _companies.html.haml
- if companies.empty?
None
- else
%table#company_list
%tr
%th Name
%th Description
%th Products
%th
= render companies
Run Code Online (Sandbox Code Playgroud)
应用程序/视图/公司/ _livesearch_box.html.haml
= content_for :scripts, "jlivesearch companies"
= form_tag "#", :autocomplete => :off, :remote => true do
%span.light
Search:
= text_field_tag :search
:javascript
$('#search').livesearch({
searchCallback: update_listed_companies,
queryDelay: 200,
innerText: "Search companies"
});
Run Code Online (Sandbox Code Playgroud)
公共/ Java脚本/ companies.js
function update_listed_companies(query) {
if(typeof query == "undefined")
query = "";
$("#company_list_container").showWith(
"/companies/livesearch?query=" + query,
false
);
}
Run Code Online (Sandbox Code Playgroud)
公共/ Java脚本/ application.js中
(function($) {
$.fn.showWith = function (what, popup) {
element = this;
$.get(what, function(data) {
element.html(data);
if(popup)
element.bPopup();
});
return element;
};
})(jQuery);
Run Code Online (Sandbox Code Playgroud)
以下是让我对代码的最优性产生怀疑的事情:
_livesearch_box.html.haml
.public/javascripts/companies_livesearch.js
我必须硬编码#search
它的部分.#company_list_container
(这是_companies.html.haml
渲染的div )硬编码public/javascripts/companies.js
./companies/liveseach?query=
硬编码的路径public/javascript/companies.js
.app/coffeescripts/
)并编译它public/javascripts
.但在我的应用程序中,我也有一些.js.erb
文件app/views/companies
; 例如,我有一个投票系统,在app/views/companies/_vote.js.erb中使用以下
内容:
$("#vote_link_<%= escape_javascript(@company.id.to_s) %>").html("<%= escape_javascript(vote_link_for(@company)) %>")
用"Unvote this company"替换"投票给这家公司"链接(反之亦然) Ajax请求,由控制器中的vote
和unvote
操作呈现.我知道有一个coffee-haml-filter可以在haml文件中编译CoffeeScript,但它不是我真正需要的东西,而且通常被弃用并被视为脏东西(?).所以问题至少是:
app/views/*/*.js.*
?app/views/*/*.js.*
文件吗?很抱歉这个问题很长,并且感谢你们走到尽头!
有一些解决方案,比如js-routes(我的fork),它允许你Router.post_path(3)
在JS/CS中编写.这样你就可以绕过硬编码网址.
我建议你不要混淆JS和Ruby.在大多数情况下,您可以通过重构JS代码来解决这个问题,结果将更容易阅读,并且可以简单地移动到纯JS/CS文件中.
# based on your vote-link example and assuming that your link
# looks like:
#
# %a(href="#"){:"data-company-id" => @company.id} Vote
# => <a href="#" data-company-id="6">Vote</a>
makeAllCompaniesVotable: () ->
$('.company a.voteLink').click ->
companyId = $(this).data('company-id')
$.ajax
url: Router.vote_company_path(companyId)
# ...
Run Code Online (Sandbox Code Playgroud)
除非你做邪恶的eval-magic,否则你甚至都不需要escape_javascript
.但是你必须从你的局部内部删除JavaScript.jquery.livequery
使过渡更容易.
$(`.company`).livequery ->
# do something with $(this)
Run Code Online (Sandbox Code Playgroud)
每次将a .company
插入文档时都会调用.
如果您正在为特定的dom-tree(或特定视图)编写代码,我不认为这是一种不好的做法.编写不引人注目的JS就像编写CSS一样 - 我们#company_list_container
也在CSS中进行硬编码,不是吗?
$("#vote_link_<%= escape_javascript(@company.id.to_s) %>") # this is ugly though
Run Code Online (Sandbox Code Playgroud)
要在静态CoffeeScript文件和视图之间建立接口,我倾向于编写如下内容:
:javascript
$(function(){Companies.index()});
$(function(){Application.globalEnhancements()});
Run Code Online (Sandbox Code Playgroud)
在我的观点结束时.然后,这将调用我使用CoffeeScript编写的函数,然后使用所有需要的脚本增强该站点.可能有更好的方法(比如有一个类似Rails的JavaScript路由器 - 请参阅Backbone.js),但它很简单,对我有用.
如果我经常需要一些数据(例如:current_user):
:javascript
window.current_user = #{current_user.to_json};
Run Code Online (Sandbox Code Playgroud)
但是我不认为有一种有效的重构方法.我不得不做很多重构来删除我的ERB/JS混乱.不过还是值得的.
归档时间: |
|
查看次数: |
1499 次 |
最近记录: |