1

使用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 文件中初始化的所有函数。

有人实施过类似的系统吗?

4

0 回答 0