私はこのスレッドで提案されている方法を読んで使用しようとしています: 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オブジェクトを出力します。
どうすればこれを修正できますか?
更新:すべてのストアレコードが同じモデルインスタンスを共有しているためではないかと思いますか?それについて何かできるでしょうか、それとも上記の方法全体がストアの使用に失敗するのでしょうか?