我正在学习CoffeeScript和Backbone JS。我想加载一件装备。是的,我知道我不需要Backbone JS - 但它帮助我学习我是否从基础开始。一旦页面加载,我希望它从服务器中获取一些JSON,并将其显示在页面上。
到目前为止,这是我的咖啡因:
jQuery ->
class Equipment extends Backbone.Model
defaults:
title:''
desc:''
url:'/getData'
class ItemView extends Backbone.View
tagName: 'div'
initialize: ->
_.bindAll @, 'render'
render: ->
$(@el).html """
<h1>#{@model.get 'title'}</h2>
<p>#{@model.get 'desc'}</p>
"""
@
class AppRouter extends Backbone.Router.extend
routes:
'':'getData'
getData: ->
@equipment = new @Equipment()
@equipmentView = new @ItemView
model: @equipment
@equipment.fetch()
$('div').html @equipmentView.render().el
appRouter = new AppRouter
Backbone.history.start()
我觉得我已经准备好了所有部分,并且没有错误(无论是在编译还是运行页面)。
我期望从服务器回来的基本JSON只是一个回应这个的PHP页面:
{
"title": "title",
"desc": "description"
}
我错过了什么?
答案 0 :(得分:0)
@ equipment.fetch()是否会触发HTTP请求?
根据我的理解,您必须设置id:@equipment = new @Equipment(id:123)
,这将触发“/ getData / 123”请求。
或指定抓取中的网址:@equipment.fetch(url:"/getData")
以加载
但是视图仍然是空的,因为在执行View render()时尚未加载数据。当模型发生变化时,Backbone不会自动更新视图(与EmberJS一样)。
将@listenTo(@model, "change", @render)
添加到initialize方法,以便在模型更改时重新渲染。
我找到了一本很好的指南/教程 http://adamjspooner.github.com/coffeescript-meet-backbonejs/
答案 1 :(得分:0)
你必须告诉Backbone路由你的初始URL(''),如下所示:
Backbone.history.start pushState: true
你也应该传递一个id(我认为Backbone将在你的情况下请求/getData/undefined
并在旁注上我认为你应该使用咖啡的胖箭而不是bindAll
(它是众多伟大的人之一关于coffeescript的事情,但是你应该摆脱一些@
因为它们不再引用窗口...