0

私はこのスレッドで提案されている方法を読んで使用しようとしています: SenchaTouchのモデルにカスタム検証ルールを追加する方法

したがって、最初に、カスタム検証タイプをExt.data.validationsシングルトンに追加します。

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";
}

次に、ST2を使用しているので、BenGの提案を適用します。Ext.data.Modelを拡張して、「self」(this)への参照を含めます。

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;
            }
        }
    }
});

最後に、CustomModelBaseを拡張するモデルを作成します。このモデルをMyApp.model.MyModelと呼びましょう。その中にカスタム検証ルールを定義します。

Ext.define('MyApp.model.MyModel', {
    extend: 'MyApp.model.CustomModelBase',
    config: {
        fields: [ {name:'field1'} ],

        validations: [
            { 
                type: 'custom', field: 'field1', message: "Your field is bad",
                fn: function (value) {
                     **console.log(this);**
                   return (value>0);
                }
            }           
        ],

        proxy: {
            type: 'localstorage',
            id  : 'MyApp-Local-Storage'
       }        
    }
});

これで、MyModelのインスタンスが1つだけ作成されると、すべてがうまく機能します。

問題は、MyModelのストアがある場合です。そうすると、fn関数で受け取った「this」への参照は常にストア内の最新のアイテムのように見えます。より正確には、console.log(this)は常にストアの最新のRecordオブジェクトを出力します。

どうすればこれを修正できますか?

更新:すべてのストアレコードが同じモデルインスタンスを共有しているためではないかと思いますか?それについて何かできるでしょうか、それとも上記の方法全体がストアの使用に失敗するのでしょうか?

4

1 に答える 1

0

この解決策を見つけました (Sencha Touch 1.0 フォーラムで、しかし ST2 ではうまくいきました): http://www.sencha.com/forum/showthread.php?122680-Conditional-fields-validations

Model クラスの validate() メソッドのオーバーライドが必要ですが、気にしなければ、以前に公開したものよりも簡単です...

于 2012-04-12T09:34:34.790 に答える