Backbone Save()不发送帖子

时间:2014-06-13 03:34:08

标签: javascript jquery backbone.js backbone-views

我是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/'

3 个答案:

答案 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) - 调查将接受模型(单个对象)

希望这有帮助。