我一直在尝试玩游戏!几个星期以来的框架,已经完成了 Zen 任务示例应用程序的一半,从第 5 章到第 6 章的信息似乎有很大的差距。
我已经按照描述创建了 main.coffee 文件并且应用程序编译正常,但是我收到以下错误“未捕获的类型错误:对象 # 的属性 'children'<HTMLUListElement>
不是函数”。
这意味着我正在尝试在 HTML 元素上调用 jQuery,但是我实际上是从示例中复制和粘贴的,所以无法理解我能做什么,它必须对编写教程的人有用,对吧?!
无论如何,我使用的是 Play 2.2.0,并且咖啡脚本的编写如下......
class Drawer extends Backbone.View
$ ->
drawer = new Drawer el: $("#travelgroups")
class Drawer extends Backbone.View
initialize: ->
@el.children("li").each (i,group) ->
new Group
el: $(group)
$("li",group).each (i,travelgroup) ->
new TravelGroup
el: $(travelgroup)
生成的 main.js 文件中显示错误的部分如下
Drawer.prototype.initialize = function() {
return this.el.children("li").each(function(i, group) {
new Group({
el: $(group)
});
return $("li", group).each(function(i, travelgroup) {
return new TravelGroup({
el: $(travelgroup)
});
});
});
};
作为第二个问题,咖啡文件本身应该包含“内部”类声明还是应该创建单独的 .java 类文件?就像我说的,教程章节之间的详细解释存在很大差距,所以有点困惑,因为 coffescript 对我来说是全新的,并且以前从未见过实际 .java 类文件之外的类声明?
编辑...
完整的咖啡脚本文件如下。压痕已经是原来的样子了。
$(".options dt, .users dt").live "click", (e) ->
e.preventDefault()
if $(e.target).parent().hasClass("opened")
$(e.target).parent().removeClass("opened")
else
$(e.target).parent().addClass("opened")
$(document).one "click", ->
$(e.target).parent().removeClass("opened")
false
$.fn.editInPlace = (method, options...) ->
this.each ->
methods =
# public methods
init: (options) ->
valid = (e) =>
newValue = @input.val()
options.onChange.call(options.context, newValue)
cancel = (e) =>
@el.show()
@input.hide()
@el = $(this).dblclick(methods.edit)
@input = $("<input type='text' />")
.insertBefore(@el)
.keyup (e) ->
switch(e.keyCode)
# Enter key
when 13 then $(this).blur()
# Escape key
when 27 then cancel(e)
.blur(valid)
.hide()
edit: ->
@input
.val(@el.text())
.show()
.focus()
.select()
@el.hide()
close: (newName) ->
@el.text(newName).show()
@input.hide()
# jQuery approach: http://docs.jquery.com/Plugins/Authoring
if ( methods[method] )
return methods[ method ].apply(this, options)
else if (typeof method == 'object')
return methods.init.call(this, method)
else
$.error("Method " + method + " does not exist.")
class Drawer extends Backbone.View
$ ->
drawer = new Drawer el: $("#travelgroups")
class Drawer extends Backbone.View
initialize: ->
@el.children("li").each (i,group) ->
new Group
el: $(group)
$("li",group).each (i,travelgroup) ->
new TravelGroup
el: $(travelgroup)
class Group extends Backbone.View
events:
"click .toggle" : "toggle"
"click .newTravelGroup" : "newTravelgroup"
toggle: (e) ->
e.preventDefault()
@el.toggleClass("closed")
false
newProject: (e) ->
@el.removeClass("closed")
r = jsRoutes.controllers.TravelGroups.add()
$.ajax
url: r.url
type: r.type
context: this
data:
group: @el.attr("data-group")
success: (tpl) ->
_list = $("ul",@el)
_view = new TravelGroup
el: $(tpl).appendTo(_list)
_view.el.find(".name").editInPlace("edit")
error: (err) ->
$.error("Error: " + err)
class TravelGroup extends Backbone.View
和 HTML 如下... group.scala.html
@(group: String, travelgroups: List[TravelGroup])
<li data-group="@group">
<span class="toggle"></span>
<h4 class="groupName">@group</h4>
<span class="loader">Loading</span>
<dl class="options">
<dt>Options</dt>
<dd>
<button class="newTravelGroup">New travel group</button>
<button class="deleteGroup">Remove group</button>
</dd>
</dl>
<ul>
@travelgroups.map { travelgroup =>
@views.html.travelgroups.item(travelgroup)
}
</ul>
</li>
item.scala.html...
@(travelgroup: TravelGroup)
<li data-project="@travelgroup.id">
<a class="name" href="#">@travelgroup.name</a>
<button class="delete" href="#">Delete</button>
<span class="loader">Loading</span>
</li>