4

検証に関するバックボーンのドキュメントによると、次のように述べています。

検証でエラーが返された場合、設定と保存は続行されず、モデルの属性は変更されません。

したがって、検証が失敗した場合、そのセットまたは保存を読み取る方法は決して実行されません。しかし、それは私が得ている結果ではありません。検証が失敗した場合でも、POST/PUT 要求を送信します。ドキュメントを間違って読んでいるか、コードで何か間違ったことをしていますか?

これが私の関連コードです: https://gist.github.com/80f6ef0099fbe96025dc

App.Models.Test = Backbone.Model.extend(
    urlRoot: '/api/test'

    validate: (attrs) ->
        errors = []
        if attrs.to is ''
            errors.push
                name: "to"
                field: "js-to"
                message: "You must enter a to address"
        if attrs.subject is ''
            errors.push
                name: "subject"
                field: "js-subject"
                message: "You must enter a subject"

        # Return our errors array if it isn't empty
        errors  if errors.length > 0
)

App.Views.Details = Backbone.View.extend(
    initialize: ->
        @model.bind "error", @error, this

    events:
        "click #js-save": "saveItem"

    saveItem: (e) ->
        e.preventDefault()

        # Set the model then save it.
        @model.set
            subject: $("#js-subject").val()
            message: $("#js-message").val()
            mailbox_id: $("#js-from").val()
            to: $("#js-to").val()
            cc: $("#js-cc").val()
            bcc: $("#js-bcc").val()
            tags: App.Helpers.tagsToObject $('#js-tags').val()
            scope: $('#js-scope').val()
            attachments: attachments

        @model.save null,
            success: (model, response) =>
                App.Helpers.showAlert "Success!", "Saved Successfully", "alert-success"
                @next()
            error: (model, response) ->
                App.Helpers.showAlert "Error", "An error occurred while trying to save this item", "alert-error"

    # Show the errors based on validation failure.
    error: (model, error) ->
        App.Helpers.displayValidationErrors error
4

1 に答える 1

5

モデルを保存するには、次のようにします。

@model.save null,
    success: -> ...
    error:   -> ...

それnullが問題の原因であり、使用する{}と物事がより良く機能し始めます。あなたとあなた@model.set@model.save呼び出しを組み合わせると、物事はさらに良くなります:

attrs =
    subject: $("#js-subject").val()
    #...
@model.save attrs,
    success: -> ...
    error:   -> ...

呼び出しは次のsaveようになります。

保存 model.save([attributes], [options])
[...]属性ハッシュ (のように
)には、変更したい属性が含まれている必要がありますset

nullしたがって、 forを渡すというattributesことは、モデルをそのまま保存することを意味します。

モデルを作成する場合save、検証はほとんど に任せます。コードは次のようsetになります。

if (attrs && !this.set(attrs, options.wait ? silentOptions : options)) {
  return false;
}

あなたのattrs意志はnullそうset呼ばれません。ただし、をsave処理させるsetと、目的の動作が得られます。wait: trueオプションsaveを渡した場合、渡された属性に対して手動で検証を実行します。

if (options.wait) {
  if (!this._validate(attrs, options)) return false;
  ...
}

内部メソッドは、簿記とエラー処理を_validate行う のラッパーです。validateあなたは使っwait: trueていないので、これはあなたには当てはまりませんが、とにかく言及する価値があると思いました.

validate常に失敗するモデルの簡単な例を考えてみましょう。あなたがこれを言うなら:

@model.on 'error', @error
@model.save attrs,
    success: -> console.log 'AJAX success'
    error:   -> console.log 'AJAX error'

その後、いくつかの属性で呼び出すことになり、を呼び出す@errorため、呼び出されます。デモ: http://jsfiddle.net/ambiguous/HHQ2N/1/savesetsetvalidate

しかし、あなたが言うなら:

@model.save null, ...

これnull により、set呼び出しがスキップされます。デモ: http://jsfiddle.net/ambiguous/6pX2e/ (ここの AJAX は失敗します)。

直前の@model.set呼び出し@model.saveでエラー ハンドラーがトリガーされるはずですが、何@model.setが返されるかを確認しないと、実行がやみくもにsave呼び出しに進み、サーバーと通信します。


要約すると、ここでは次の 3 つのことが行われています。

  1. あなたはsave彼らを本来あるべき方法で呼んでいません。
  2. @model.set戻り値を無視しているため、検証エラーをトラップする機会が失われています。
  3. Backbone の の引数処理は改善されるsave(null, ...)可能性がありますが、それを呼び出す奇妙な方法を処理する努力をする価値があるかどうかはわかりません。

set/saveペアを組み合わせてa にするか、何が返されるsaveかを確認する必要があります。set

于 2012-06-11T17:58:06.780 に答える