1

昨日、かなり調べた結果、バックボーン モデルに個々の属性を設定したくない場合 (および検証を行いたい場合) を送信する必要があることがわかりました{silent: true}。そうは言っても、backbone.js の次のリリースでは、silent: true実際にはまだ検証が実行されることもわかりました。

これに関する問題は、実際に属性を設定することからブロック セットを検証することです。したがって、silent:true がなければ、単一の属性を受け入れる set メソッドを使用しても意味がありません。これを回避するために、validate メソッドは次のようになります。

validate : function(attrs) {
    var errors = {};
    if (typeof attrs.first_name !== 'undefined' && !attrs.first_name) {
        errors.first_name = "First name can't be empty";
    }
    ...
    if (!_.isEmpty(errors)) {
        return errors;
    }
}

これにより、保存が機能しなくなります。そこで、次のように書くことにしました。

if (_.isEmpty(attrs)) {
    attrs = this.attributes;
}

それに関する問題は、保存時に送信された属性がある場合、それらをマージする必要があることです。これは問題ないと思いますが、これは、いくつかの単純な検証を機能させる/実行しないようにするためのかなりの量の作業です。さらに、_validate をオーバーライドしない限り、すべてのモデルでそれを行う必要があります。

これを行うより良い方法はありますか?

4

1 に答える 1

3

バックボーンはデフォルトで、古い属性をここの古い属性で拡張します: https://github.com/documentcloud/backbone/blob/master/backbone.js#L574

そのため、新しい属性のみが検証方法を壊す可能性があります。

ここで、あなたの問題は、すべての属性を同時に設定していないのに、すべての属性の存在にあまりにも多くの検証を結びつけることだと思います。そのため、他の属性が として設定できることを確認する必要がありますundefined

例:

// Check if name is set, ignore otherwise
if( attr.name && attr.name !== "Santa" ) { return "Can't be Santa"; }

別の解決策は、すべての属性に有効なデフォルト値を与えることです。

于 2012-12-14T19:15:54.077 に答える