2012-04-11 18 views
0

私はこのスレッドで提案された方法を読んで使用しようとしています: How to add a custom validation rule to a model in Sencha TouchSencha touch 2.0:店舗でのカスタムモデル検証

だから最初、私は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を使用しておりますので、私はベンGが提案しているものを適用します。 Ext.data.Modelを拡張して 'self'(this)への参照を含める。

Ext.define( 'MyApp.model.CustomModelBase'、{ が拡張: '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'sの店を持っています。それを行うと、fn関数で受け取った 'this'への参照は、常にストア内の最新のアイテムと思われます。 より正確には、console.log(this)は常にストアの最新のRecordオブジェクトを出力します。

どうすればこの問題を解決できますか?

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

答えて

関連する問題