使用rails 3资产管道,我将javascript(通过使用coffeescript)构建到有关模型的文件中。例如,所有与评论编写相关的 javascript 都存储在 /app/assets/javascripts/comments.js.coffee 中,而用户覆盖相关(获取 a:href 并在其上触发 ajax)存储在 /app/assets/javascripts/users .js.咖啡。
但是,现在我使用越来越多的 AJAX 调用,其中 HTML 内容被动态拉到站点。问题是我需要在各种文件中执行 javascript,但由于咖啡脚本的范围是函数内部,我无法访问它们。
假设我有一个带有以下代码的 general.js.coffee 文件
$(document).ready ->
# Parse all images with action
$("img.clickableaction").click ->
# Fetch some content
$.ajax
url: "something.php"
dataType: "html"
complete: (xhr, status) ->
# We got the content, set it up to a container
$("#somecontainer").html(receiveddata)
# The tricky part:
# run code in comments.js.coffee for #somecontainer (or for the whole dom)
# run code in users.js.coffee for #somecontainer (or for the whole dom)
例如,comments.js.coffee 包含以下内容:
$(document).ready ->
commentDiv = $('div#commentsContainer')
commentsFetch = $('a.commentsFetch')
# Set commentid for comments fetch
commentsFetch.bind 'ajax:beforeSend', (event, xhr, settings) ->
# do stuff
comments.js.coffee 代码适用于初始页面视图,例如当用户加载页面时收到的 HTML 代码。但现在,我需要解析从 ajax 调用返回的内容的 comments.js.coffee 代码。
我无法在 comments.js 中创建函数,因为它的范围很广,无法从 general.js 访问。这是咖啡脚本产生的:
(function() {
$(document).ready(function() {
var commentDiv, commentsFetch;
commentDiv = $('div#commentsContainer');
commentsFetch = $('a.commentsFetch');
}
})
我可以为每个单独的文件创建一个全局函数,例如window.comments && window.users,但是我需要从许多需要ajax oncomplete 调用的地方调用window.comments。从长远来看,这将产生重复且难以维护的代码。
怎么可能做出这样的事情:
// comments.js
window.ajaxExecuteBlocks.push(function() { // comments related stuff });
// user.js
window.ajaxExecuteBlocks.push(function() { // user related stuff });
// general.js ajax on complete:
window.runExecuteBlocks()
然后,runExecuteBlocks 将以某种方式运行已在各种特定于控制器的 javascript 文件中初始化的所有函数。
有人实施过类似的系统吗?