在资产和视图之间共享代码

时间:2014-06-21 23:56:37

标签: javascript ruby-on-rails coffeescript asset-pipeline

我有一组大约40行代码,我需要在.js.coffee资产文件和视图中的.js.erb文件中使用。它具有在我加载页面上的现有对象(资产文件中的代码)时以及动态创建新对象(视图中的代码)时使用的对象的设置代码。

似乎我不能在资产文件中使用partial,因为它们是静态的。我试图在资产中为代码创建一个函数并在视图中调用它,但是视图文件找不到该函数。 (这是因为Coffeescript将所有代码包装在一个匿名函数中吗?)目前,我在两个文件上都复制了代码,但是它很潮湿,而且通常很不愉快。

来自资产的代码

setUpEvent = (start, end, $event) ->
    startIdx = getHeaderIndex start
    $event.addClass "cell-#{startIdx}"

    endIdx = getHeaderIndex end
    $event.width((endIdx - startIdx) * 94)

    draggableOptions =
        revert: 'invalid'
        helper: 'clone'  # needed to work with grid
        grid: [101, 101]
        start: (e, ui) ->
            # hide so only helper clone is visible
            $(this).css 'visibility', 'hidden'
            ui.helper.addClass 'dragging dragged-event'
        stop: (e, ui) ->
            $(this).css 'visibility', 'visible'
            ui.helper.removeClass 'dragging dragged-event'

    resizableOptions =
        containment: 'parent'
        grid: [100, 0]
        handles: 'e, w'
        minWidth: 94
        stop: (e, ui) ->
            eventId = ui.element.data 'id'
            startColumn = Math.floor(ui.position.left / 100)
            endColumn = Math.ceil((ui.position.left + ui.size.width) / 100)
            data =
                start: getColumnDate startColumn
                end: getColumnDate endColumn
            updateEvent ui.element.data('id'), data

    $event
        .draggable(draggableOptions)
        .resizable(resizableOptions)

如何在资产和视图之间共享代码?

2 个答案:

答案 0 :(得分:0)

无论文件外部是否可见,您的功能都会运行。只需让它访问它需要的任何DOM元素,并确保它包含在$(document).ready)回调中。

答案 1 :(得分:0)

要访问文件外部的Coffeescript函数,我必须在函数前加上@(即@setUpEvent)。这仅在函数在顶层定义时才有效,因为what @ really does is bind the variable to this