我是Backbone的新手,所以我希望我能错过一些简单的东西。我正在构建一个简单的调查创建/调查,让应用程序通过嵌套模型等工作。我正在为后端运行一个安静的Rails服务器。
我努力让调查模型保存到服务器中。它似乎并不像邮件请求实际发生,因此它实际上并没有得到更新。我缺少什么想法?
调查模型:
class SurveyMe.Models.Survey extends Backbone.Model
调查编辑视图:
class SurveyMe.Views.SurveyEdit extends Backbone.View
template: JST['templates/surveys/survey_edit']
initialize: ->
@model.on('all', @render, this)
events: {
'click #back': 'back'
'submit #survey': 'update'
}
render: ->
$(@el).html(@template(survey: @model))
this
back: ->
Backbone.history.navigate("surveys",true)
update: ->
@model.set("title", $('#title').val())
@model.set("survey_limit", $('#survey_limit').val())
@model.save()
Backbone.history.navigate("surveys",true)
调查编辑模板:
<h1>Edit Survey</h1>
<form id="survey">
<div class="input-group">
<span class="input-group-addon">Title:</span>
<input id="title" type="text" class="form-control" value="<%= @survey.get('title') %>">
<br>
</div>
<br>
<div class="input-group">
<span class="input-group-addon">Desired Responses:</span>
<input id="survey_limit" type="text" class="form-control" value="<%= @survey.get('survey_limit') %>">
<br>
</div>
<hr>
<button class="btn" id="back">Back</button>
<input type="submit" class="btn" id="update" value="Update">
</form>
编辑:添加索引/路由器/集合
指数:
class SurveyMe.Views.SurveysIndex extends Backbone.View
template: JST['templates/surveys/index']
events:
'submit #survey':'createSurvey'
initialize: ->
@collection.on('reset', @render, this)
@collection.on('add', @addSurvey, this)
render: ->
$(@el).html(@template())
@collection.each(@addSurvey)
console.log(@collection.length)
this
addSurvey: (survey) ->
view = new SurveyMe.Views.Survey(model: survey)
@$('#surveys').append(view.render().el)
createSurvey: ->
console.log("Survey created")
路由器:
class SurveyMe.Routers.Surveys extends Backbone.Router
routes:
'surveys/:id': 'edit',
'surveys': "index"
initialize: ->
@collection = new SurveyMe.Collections.Surveys()
@collection.fetch(reset: true)
index: ->
view = new SurveyMe.Views.SurveysIndex(collection: @collection)
$("#container").html(view.render().el)
edit: (id) ->
survey = @collection.get(id)
view = new SurveyMe.Views.SurveyEdit(model: survey)
$("#container").html(view.render().el)
收集:
class SurveyMe.Collections.Surveys extends Backbone.Collection
model: SurveyMe.Models.Survey
url: '/surveys/'
答案 0 :(得分:1)
狂野猜测,但可能是因为你在coffeescript中使用的是简单箭头而不是胖箭头:
update: ->
@title = $('#title').val()
@survey_limit = $('#survey_limit').val()
this.save()
您从even开始使用此方法,这意味着this
的范围限定为事件触发器而不是模型。使用胖箭头:
update: =>
它应该没问题......
答案 1 :(得分:0)
您的问题可能在您的模型的update
功能范围内。我没有看到最初填充模型的fetch()
调用,因此我猜测数据仅在客户端填充,并发送到服务器端。如果是这种情况,则需要在模型中设置此数据。您可以在保存呼叫之前执行此操作:
this.model.set("title", $('#title').val());
this.model.set("survey_limit", $('#survey_limit').val());
或者您可以直接在保存电话中执行此操作:
this.model.save({
title: $('#title').val(),
survey_limit: $('#survey_limit').val()
});
你可以在模型中执行此操作,但正如您从上面的代码中看到的,我建议将该逻辑放在视图中。这样,模型就不必了解视图本身的内容。
答案 2 :(得分:0)
你的模型也应该有这样的东西,
model.collection
如果您传递{collection:...}作为选项,模型将获得一个集合属性,该属性将用于指示模型所属的集合,并用于帮助计算模型的网址。通常在首次将模型添加到集合时自动创建model.collection属性。请注意,反之亦然,因为将此选项传递给构造函数不会自动将模型添加到集合中。有时候很有用。
还有一个想法,你确定你的REST网址应该是&#34; / survey&#34;?在我们的应用程序中,我们为urlRoot中指定的模型提供了单独的url。
例如,如果集合c具有模型m1,m2,
c1 - &gt; url(/ surveys) - 调查将接受一组对象
m1,m2 - > (/ survey) - 调查将接受模型(单个对象)
希望这有帮助。