2

グーグルの量が私の混乱を解決することに成功していないので、私はここで質問をしたいと思いました。

モデルを保存して、成功/エラーのコールバックを利用しようとしています。バックボーンのドキュメントには、次のようにモデルを保存すると記載されていますmodel.save([attributes], [options])

モデル全体を保存する方法(つまり、属性を指定せずに)を説明しているドキュメントのどこにも見つかりませんが、2番目の答えがモデル全体を保存するように指示しているこの質問に出くわしました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応答によってモデルが有効であると言われています。実際にモデルを見ると、3つのフィールドすべてが入力されていることがわかります。

同様に、次の2つのコンソールでエラーが記録され、@model.validate()両方がそれぞれとを@model.isValid()返します。ただし、モデルを保存しようとしたときに得られる応答は次のとおりです。undefinedtrueObject {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

モデルの属性が以前に正しく設定されていることを確認しますsaveか?その属性が設定されていなくても、 (関数の定義validate方法によっては)合格する可能性があります。validateそれを確認するために、コンソールでモデルを印刷してみてください。ところで、nullでは​​なく渡す方が良いです。そうすれば、モデルのメソッドは呼び出されません。{}saveset

更新しました:

バックボーンのソースコードによると、nullの最初の引数として渡す場合save、モデルがサーバーに正常に保存されるまで、モデルの属性はそのまま保持されます。setしたがって、もう1つの可能性は、サーバーがモデルの保存に成功したが、破損したオブジェクトを返し、モデルのメソッドが失敗したことです。それでも問題を解決できない場合は、model.setメソッドをトレースすると役立つ場合があります。</ p>

于 2012-12-30T10:19:56.103 に答える
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_namelast_name必要emailなため)。

backback.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 に答える