2011-10-20 12 views
14

私はいつもモデルは関係なく、入力の提供小文字で名前を保存するようにする方法を見つけようとしているBACKBONE.JS - カスタムセッター

window.model= Backbone.Model.extend({ 
    defaults:{ 
     name: "", 
     date: new Date().valueOf() 
    } 
}) 

ような単純なバックボーンモデルを想像してみてください。すなわち、

model.set({name: "AbCd"}) 
model.get("name") // prints "AbCd" = current behavior 
model.get("name") // print "abcd" = required behavior 

これを行う最善の方法は何ですか?

  1. オーバーライドこのベースモデルでの変更を待機し、消毒の入力を保存する「に設定」方法
  2. 使用「SantizedModel」:ここで私は考えることができるすべてです。すべてのビューコードは、代わりにこのサニタイズされたモデルを渡されます。

私が言及した特定の "小文字への"例は、技術的には検索時にビューで処理する方が良いかもしれませんが、たとえば、ユーザーがポンドで値を入力するという別のケースを想像してください。 $ sは私のデータベースにあります。同じモデルに対して異なる見解があるかもしれませんし、どこでも "toLowerCase"を行う必要はありません。

思考?

答えて

5

これは、それがために作られたものではありませんので、それはハックだろうが、あなたはいつもこのためにバリデータを使用することができます。

window.model= Backbone.Model.extend({ 
    validate: function(attrs) { 
     if(attrs.name) { 
     attrs.name = attrs.name.toLowerCase() 
     } 

     return true; 
    } 
}) 

検証機能がsilent限り(と呼ばれますオプションが設定されていない場合)、実際に設定される前にデータを変更する機会が与えられます。

+0

ありがとうございました。私はこれも考慮しましたが、これはセットアサイン機能をオーバーライドするか、小文字に設定してバックボーンセットに渡す新しい "setProperty"機能を追加すると、読みやすくするための段階であると考えられます。私が何かを逃していない限り? – Naren

+0

'set'メソッドをオーバーライドして、何をする必要があるのか​​を確認するのは間違いありません。 'Backbone.Model.prototype.set'をいくつかのプリプロセッサを呼び出すように拡張することも考えられます。これは次のようなものです:https://gist.github.com/1310972 –

+0

バリデーションはsaveメソッドoptions.validate = trueが設定されている場合(サイレントはここでは使用しませんが、答えはかなり古いです) – webstrap

10

UPDATEhttps://github.com/berzniz/backbone.getters.setters


あなたはこの(あなたのモデルに追加)のようなsetメソッドをオーバーライドすることができます:あなたは、プラグインを使用することができます

set: function(key, value, options) { 
    // Normalize the key-value into an object 
    if (_.isObject(key) || key == null) { 
     attrs = key; 
     options = value; 
    } else { 
     attrs = {}; 
     attrs[key] = value; 
    } 

    // Go over all the set attributes and make your changes 
    for (attr in attrs) { 
     if (attr == 'name') { 
      attrs['name'] = attrs['name'].toLowerCase(); 
     } 
    } 

    return Backbone.Model.prototype.set.call(this, attrs, options); 
} 
+3

ループの代わりに私はお勧めしますif(attrs.name)attrs.name = attrs.name。toLowerCase(); – webstrap

+0

最初のパラメータがオブジェクトである場合、属性の設定は、最初のパラメータとして文字列を使用して 'set'に委譲されることに注意してください。正規化は、最初のパラメータが文字列の場合にのみ必要です。 – Webthusiast

3

プープーまでもありません私自身の角ですが、これを回避するための "計算された"特性を持つI created a Backbone modelがあります。言い換えれば、

var bm = Backbone.Model.extend({ 
    defaults: { 
    fullName: function(){return this.firstName + " " + this.lastName}, 
    lowerCaseName: function(){ 
     //Should probably belong in the view 
     return this.firstName.toLowerCase(); 

    } 
    } 
}) 

計算されたプロパティの変更をリッスンし、これを通常のものとして扱うだけです。

The plugin Bereznitskey mentionedでも有効です。

+0

私はこれを試していますが、戻り値ではなく実際の関数をエコーし​​ています。 'defaults:{距離:関数(){戻り値10; } }、 'console.log(this.model.get( 'distance'));' ?? – trapper

+0

@trapper - あなたはリンクされたgithubから "BasecomputedModel"から拡張していますか? – Naren