假设我执行以下代码:
class Test
t: ->
"hell"
d: ->
console.log t()
"no"
Run Code Online (Sandbox Code Playgroud)
它将编译为类似于:
(function() {
this.Test = (function() {
function Test() {}
Test.prototype.t = function() {
return "hell";
};
Test.prototype.d = function() {
console.log(t());
return "no";
};
return Test;
})();
}).call(this);
Run Code Online (Sandbox Code Playgroud)
好的,我无法调用方法t()内部的d()方法.
为什么不?我该如何解决?
提前致谢.
我有这个:
get_json = (url) ->
$.getJSON "#{url}.json", {}, (json, response) ->
return json
Run Code Online (Sandbox Code Playgroud)
但这编译为:
getJson = function(url) {
return $.getJSON("" + url + ".json", {}, function(json, response) {
return json;
});
};
Run Code Online (Sandbox Code Playgroud)
..并返回响应对象.我怎样才能返回json呢?
我遇到了jquery-file-upload和Backbone的上下文问题.在fileupload'完成'回调中,我想调用Backbone视图中定义的另一个函数,但是我丢失了上下文.
class MyBackboneView extends Backbone.view
initialize_fileupload: ->
$('form#my_form').fileupload
done: (e, data) ->
this.some_function()
some_function: ->
...
Run Code Online (Sandbox Code Playgroud)
浏览器控制台中返回的错误是"未捕获的TypeError:对象#没有方法'some_function'",因为"this"不再引用Backbone视图,而是引用jquery表单元素.
有没有办法从回调中访问视图中的该函数?
javascript jquery coffeescript backbone.js jquery-file-upload
这个令牌输入来自 http://loopj.com/jquery-tokeninput/
我看到http://railscasts.com/episodes/258-token-fields-revised的教程
因为我在很多地方使用它,我需要一些时间只选择一个值,而在其他地方需要多个值.它是多值选择的代码.现在我希望它只搜索一次并只提交一个值.有没有办法在我的coffescript文件中编码它只选择一个值并停止?
my code for customers.js.coffee
jQuery ->
$('#customer_plan_tokens').tokenInput '/plans.json'
theme: 'facebook'
prePopulate: $('#customer_plan_tokens').data('load')
my code for _form.html.erb for cusomers is
<div class="form-inputs-right">
Projects: <%= f.text_field :plan_tokens, data: {load: @customer.plans}, :label => "Projects" %>
</div>
Run Code Online (Sandbox Code Playgroud) 我试图选择一个可靠的运算符"如果变量未定义或初始化,则声明并初始化".
考虑一个例子(语义不是很重要):
window.test ?= 123
location.origin ||= location.protocol + "//" + location.host
Run Code Online (Sandbox Code Playgroud)
这被转换为以下Javascript:
var _ref;
if ((_ref = window.test) == null) {
window.test = 123;
}
location.origin || (location.origin = location.protocol + "//" + location.host);
Run Code Online (Sandbox Code Playgroud)
哪种方法更好?在我看来,||=运算符更可靠,因为它也说明了"未定义"但是为什么CoffeeScript推广使用?=呢?我错过了什么吗?
很简单,我在节点中使用coffeescript看到以下语法,我从未在浏览器中看到过使用coffeescript.
{foo} = app.locals.foo
Run Code Online (Sandbox Code Playgroud)
我前往js2coffee看看它做了什么,但它在js输出中似乎是相同的
foo = app.locals.foo
Run Code Online (Sandbox Code Playgroud)
那么这里发生了什么?{}语法在这种情况下意味着什么?你为什么要用它?
所以我在JS工作很多,而且我正在做很多事情(尽量保持模块化).当前我Event.fire('eventName')在每个函数结束时调用.我正在寻找一种方法让我的对象/类中的任何函数自动调用Event.fire([function name])所有函数的末尾
例:
function MyClass(){
this.on('someFunc', this.funcTwo);
this.someFunc();
}
MyClass.prototype.on = function( event ){
// the event stuff //
}
MyClass.prototype.someFunc = function(){
console.log('someFunc');
}
MyClass.prototype.funcTwo = function(){
console.log('funcTwo');
}
Run Code Online (Sandbox Code Playgroud) 我在/assets/javascripts/leads.js.coffee中有这个
jQuery ->
getRowColour = (status) ->
switch status
when "rejected" then return '#FFA500'
when "confirmed" then return '#C0C0C0'
when "didn't connect" then return '#90EE90'
else return '#FFFFFF'
Run Code Online (Sandbox Code Playgroud)
这在我的/views/leads/index.html.erb中
<%= f.select(:status, ["to call","didn't connect","confirmed","rejected"], {:selected => lead.status}, :onchange => "$('#lead_form_#{lead.id}').submit();document.getElementById('lead_row_#{lead.id}').style.backgroundColor=getRowColour(#{lead.status});") %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
可以看出,f.select中的onchange函数有一个javascript,它调用我的coffeescript文件中的函数.
请告诉我哪里出错了?
这是关于使用Grunt.js进行动态文件映射的一般性问题,但出于示例目的,我将尝试在具有动态结构的项目中构建咖啡文件:

在这里,我可以拥有多个(动态)目标文件夹,其深度不同.查找咖啡文件仍然很容易,**/coffee/*.coffee随时都可以匹配.
我想要实现的目标是使dest属性相对于匹配的咖啡文件:
**/coffee/*.coffee../js/*.js而不是使它相对于项目文件夹(Gruntfile).
coffee: {
compile: {
files: [
{
expand: true,
src: ['**/coffee/*.coffee'],
dest: '../js/', // This won't work ! But I wish it could :)
ext: '.js'
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
你会如何实现这一目标?
我想从coffeescript类中发出事件,类似于Backbone.View的做法.
class Countdown extends Backbone.View
countdown = new Countdown
countdown.on "complete", ->
something()
Run Code Online (Sandbox Code Playgroud)
所以没有backbone.js,例如:
class Countdown extends SomeEmitter
countdown = new Countdown
countdown.start()
countdown.on "complete", ->
something()
Run Code Online (Sandbox Code Playgroud)
Atm我有这样的事情:
class SomeEmitter
events: $({})
#So I need to countdown.events.on "complete"
Run Code Online (Sandbox Code Playgroud)
但是这可能会以某种方式重构,所以我从倒计时实例而不是countdown.events发出事件.我不在我的项目中使用backbone.js,因此仅仅为Backbone.Events部分包含它是愚蠢的.我认为应该可以以某种方式扩展$({}),或jquery中可用的其他东西(jQuery.Event?)
更新:
我想我会做一些事情:
class SomeEmitter
constructor: ->
@events = ${{})
on: (eventName, cb) =>
@events.on eventName, cb
trigger: (eventName) =>
@events.trigger eventName
Run Code Online (Sandbox Code Playgroud)
我不使用Backbone.Events(或查看代码和复制片段)的原因是因为我有一个完全工作的触发器和方法的jQuery.所以应该可以扩展它,而不是编写我自己的发射器.
coffeescript ×10
javascript ×6
jquery ×3
backbone.js ×1
class ×1
gruntjs ×1
node.js ×1
oop ×1
operators ×1
railscasts ×1
ruby ×1