2

再多的谷歌搜索都无法解决我的困惑,所以我想我会在这里问这个问题。

我正在尝试保存模型并使用成功/错误回调。在主干文档中,它声明您像这样保存模型:model.save([attributes], [options]).

我在文档中找不到任何地方告诉您如何保存整个模型(即不指定属性),但遇到了这个问题,第二个答案说要保存您可以执行的整个模型model.save({}, [options])

但是我尝试这样做无济于事。我的代码如下:

骨干模型:

class Student extends Backbone.Model
  url: ->
    '/students' + (if @isNew() then '' else '/' + @id)

  validation:
    first_name:
      required: true
    last_name:
      required: true
    email:
      required: true
      pattern: 'email'

  schema: ->
    first_name:
      type: "Text"
      title: "First Name"
    last_name:
      type: "Text"
      title: "Last Name"
    email:
      type: "Text"
      title: "Email"

在我看来,我有以下功能:

class Students extends CPP.Views.Base
  ...
  saveModel = ->
    console.log "model before", @model.validate()
    console.log "model attrs", @model.attributes
    @model.save {},
      wait: true
      success: (model, response) ->
        notify "success", "Updated Profile"
      error: (model, response) =>
        console.log "model after", @model.validate()
        console.log "model after is valid", @model.isValid()
        console.log "response", response
        notify "error", "Couldn't Update"

在保存之前的第一个 console.log 中,我被告知模型是有效的,通过undefined响应的方式。如果确实查看模型,我可以看到所有三个字段都已填写。

同样,在接下来的两个控制台日志中,错误@model.validate()@model.isValid()都分别返回undefinedtrue。但是我从尝试保存模型中得到的响应是Object {first_name: "First name is required", last_name: "Last name is required", email: "Email is required"}

最后在我得到的模型属性的 console.log 中:

Object
  created_at: "2012-12-29 23:14:54"
  email: "email@email.com"
  first_name: "John"
  id: 2
  last_name: "Doe"
  type: "Student"
  updated_at: "2012-12-30 09:25:01"
  __proto__: Object

这让我相信,当我传递{}给我的模型时,它实际上是在尝试将属性保存为 nil,否则为什么会出错?

有人可以指出我做错了什么吗?我宁愿不必将每个属性单独传递给保存!

提前致谢

4

2 回答 2

1

根据建议的答案,Hui Zheng我修改了服务器中的控制器,以 JSON 格式返回学生。

然而,为了找到问题的真正根源,我阅读了关于保存的主干文档,并发现当wait: true作为选项给出时,它执行以下操作:

if (!done && options.wait) {
        this.clear(silentOptions);
        this.set(current, silentOptions);
}

在进一步调查清楚后,我发现

clear: function(options) {
  var attrs = {};
  for (var key in this.attributes) attrs[key] = void 0;
  return this.set(attrs, _.extend({}, options, {unset: true}));
},

从这里看起来好像每个属性都被清除然后被重置。但是,在清除我的模型时,我编写的验证将失败(因为first_name, last_name,email是必需的)。

backbone.validation 文档中,我们被告知可以使用参数forceUpdate: true,所以我选择在保存模型时使用它。我现在假设(尽管这可能不是一个好习惯)来自服务器的数据是正确的,因为这也已经过验证。

因此我的最终代码是:

saveModel = ->
  @model.save {},
    wait: true
    forceUpdate: true
    success: (model, response) ->
      notify "success", "Updated Profile"
    error: (model, response) ->
      notify "error", "Couldn't Update"
于 2012-12-30T17:51:14.967 回答
1

您确定之前已正确设置模型的属性save吗?即使没有设置任何属性,它仍然可能通过validate(取决于validate函数的定义方式)。请尝试在控制台中打印模型以验证这一点。顺便说一句,最好传递null而不是{}in save,这样set就不会调用模型的方法。

更新:

根据 Backbone 的源代码,如果null作为 的第一个参数传递save,模型的属性将保持不变,直到模型成功保存在服务器上。所以另一种可能是你的服务器成功保存了模型但是返回了一个损坏的对象,导致模型的set方法失败。如果仍然无法解决问题,追踪model.set方法可能会有所帮助。</p>

于 2012-12-30T10:19:56.103 回答