我有一组大约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)
如何在资产和视图之间共享代码?
答案 0 :(得分:0)
无论文件外部是否可见,您的功能都会运行。只需让它访问它需要的任何DOM元素,并确保它包含在$(document).ready)
回调中。
答案 1 :(得分:0)
要访问文件外部的Coffeescript函数,我必须在函数前加上@(即@setUpEvent
)。这仅在函数在顶层定义时才有效,因为what @ really does is bind the variable to this
。