2011-09-14 19 views
10

この記事では、組み込みの検証ルール(存在、長さ、形式、包含、除外)を使用する方法と、カスタムルールの追加は簡単だが、どのようにそれを行うか説明していない。私は最高と最低のグーグルを探して、そして、それを行う方法について何も見つけることができないsenchaドキュメントを読んだ。何か案は?Sencha Touchのモデルにカスタム検証ルールを追加する方法

http://www.sencha.com/learn/using-validations-and-associations-in-sencha-touch

答えて

8

私はそれがドキュメントのわずかなエラーのいずれかだと思います。私は彼らが、例えば、モデルに検証を追加「カスタム」に設定するタイプとモデルの検証配列にオブジェクトを追加する次に、いくつかのコードを追加して

if (Ext.data) { 
    Ext.data.validations.custom = function (config, value) { 
     if (config && Ext.isFunction(config.fn)) { 
      //this should be the model 
      if (config.self) { 
       return config.fn.call(config.self, value); 
      } else { 
       return config.fn(value); 
      } 
     } 
     else 
     { 
      return false; 
     } 
    }; 
    Ext.data.validations.customMessage = "Error"; 
} 

を動作するようになりました

{ 
    type: 'custom', field: 'SomeField', message: "Your field is bad", 
    fn: function (SomeFieldValueForThisInstance) { 
     //Add some validation code. The this pointer is set to the model object 
     //so you can call this.get("SomeOtherFieldToCheck") 
     //or any other instance method 

     //if the field is good 
     return true; 
     //else 
     return false; 
    } 
} 

更新: @salgizaは正しかった、私は正しく「この」ポインタを設定するために言及するのを忘れてしまったいくつかのステップがあります。あなたは煎茶タッチコードを見ると、あなたはExt.data.Modelのコンストラクタの最後には、オブジェクトに対して定義されたinit関数がありますかどうかをチェックしていることがわかりますし、もしそうなら、

 if (typeof this.init == 'function') { 
      this.init(); 

それを呼び出しますモデルを定義したら、プロトタイプにinit関数を追加できます。この関数では、オブジェクトの検証を繰り返し、この参照を追加します。このステップは、いずれかのモデルを作成する前に実行する必要があります。

YourModel.prototype.init = function() { 
     var i, len; 
     if (this.validations) { 
      for (i = 0, len = this.validations.length; i < len; i++) { 
       this.validations[i].self = this; 
      } 
     } 
    }; 

次に設定が自己のポインタを持っている場合は、上記のカスタム検証機能では、ちょうどチェックし、それがない場合は、自己とそれを呼び出します。上記のコードを編集して自己を使用しています。

注:モデルのinit関数が文書化されていないので、senchaがそれを取り除く場合は、このポインタをモデルの検証に追加する必要があります。

ご迷惑をおかけして申し訳ありません。

だけでなくカスタム検証を実装するために必要な
+0

回答が投稿されてから変更されているかどうかは分かりませんが、Sencha 1.1.1では検証範囲が検証対象なので、他の値を取得する方法はないようです(this.getは何もしません。 "this"はモデルではありません)。 – salgiza

+0

1) 'else'ブランチが多すぎます。 2)YourModel.prototype.initはどこに行きますか?これは意味がありません。 –

+1

@SarahVessels 1.そうです。私は2番目のelseブロックのためにaを欠いていました。申し訳ありません。 2. YourModel.prototype.initは、モデルを宣言した後で実行する限り、どこにでも置くことができます。依存関係を管理するためにRequireJSを使用していますので、モデルを組み込んだ後にプロトタイプに追加するモジュールを追加します。 –

1

、グーグルは、また検証は、モデルの設定プロパティになりましたので、私は少し煎茶タッチ2(のためのジェイソンからのコードを適応してきたgithubの

2

にこのtomalex0/SenchaTouch-Form-Validationを見つけました)。他のすべてのモデルクラスが継承する基本クラスを作成することをお勧めします。その後、これを実行したら、jasonの技術を使用してExt.data.validations singletonでカスタム検証を追加できます。

Ext.define('MyApp.model.CustomModelBase', { 
    extend: 'Ext.data.Model', 

    //adding an initializer to let custom validators access "self" 
    init : function() { 
     var i, len; 
     if (this.config.validations) { 
      for (i = 0, len = this.config.validations.length; i < len; i++) { 
       this.config.validations[i].self = this; 
      } 
     } 
    } 
}); 
2

複雑なカスタム検証をモデルに追加する最も簡単な方法は、検証メソッドを上書きすることです。下記を参照してください。これは、親呼び出しのために、組み込みの検証タイプをサポートしています。

validate: function() { 
    var me = this; 
    var errors = this.callParent(arguments); 

    /* custom complex validations here */ 
    if(true !== me.get('checkOne') && 
     true !== me.get('checkTwo') && 
     true !== me.get('checkThree')) { 
     errors.add(Ext.create('Ext.data.Error', { 
        field : 'checkOne', 
        message: 'Choose at least one check, e.g. checkOne' 
       })); 
    } 

    return errors; 
} 
関連する問題