JavaScript 怎样在 rails 的 view 中调用 .coffee 中的函数

lufeihaidao · 2013年05月16日 · 最后由 Rei 回复于 2013年05月16日 · 4022 次阅读
%button.btn.btn-primary{onclick: "test()"} submit

.test 

我的 view 中(production 模型的 new.html.haml)包含这样一段代码;在 productions.js.coffee 中则包含

test = ->
  $(".test").append("test")

这样的代码,似乎由于 coffee 自动闭包的特性,当点击按钮时提示 Uncaught ReferenceError: test is not defined ,当我把这段代码放到 application.js 中时,则可以成功。(这个编译后的 producitons.js 是存在的,可以找到,但是加了闭包)

想暴露出去可以

window.test = ->
  $(".test").append("test")

看到的解决方法是,把

test = ->
  $(".test").append("test")

改成

window.test = ->
  $(".test").append("test")

这样其实就是使 test 成为全局变量了。不知道有没有更好的方法?

@test = test

原理也是全局变量。

如果不希望全局变量,其实是要好好规划自己的 js 模块。可以看看 turbolinks 的代码

https://github.com/rails/turbolinks/blob/master/lib/assets/javascripts/turbolinks.js.coffee

@luikore 果然这样啊。

@Rei 这样可以,应该也是变成全局变量吧,不过维护起来会比加 window 方便一点

@ +1
话说直接在 html 上用onclick: "test()" 这种 指令 性的写法配合 jquery 感觉有点怪怪的……喜欢直接在 html 上写明各种指令的话,不如直接用 angular.js 什么的,而且比 jquery 也节省代码量……

#6 楼 @aptx4869 奥,才发现楼主的写法。

onclick 这种方法很不时髦,转 unobtrusive javascript

@Rei @aptx4869 我是遇到一个 rails 提交嵌套表单的问题,不知道如何用 rails 的方式解决,所以想转 js 方式,因此做了这样的尝试。我的问题是这样的:

production has many items  
item belongs to production  
production 有一个属性: material  
item 有一个属性:color  
新建 production 时,在 productions/new 页面有一个 form,可以 input produciton 的 meterial 属性,通过 fields_for 可以嵌套 items,但是 items 的数量是不固定的,应该用户输入想多少就是多少,而现有的嵌套只是嵌套固定数量(我看的是 [simple_form](https://github.com/plataformatec/simple_form/wiki/Nested-Models) 的教程)。  

因为不知怎么实现,所以我想可不可以通过 jquery 的 .post 发送数据给 create 方法,因此做了这样的尝试。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号