4

フォームがあります。そして、textfieldsその中にたくさん。プロパティを使用allowBlankして、ユーザーがフィールドを空白のままにできないようにし、blankTextカスタムの「空白エラー」テキストを定義します。

{
 xtype: 'textfield',
 fieldLabel: 'Surname',
 name: 'person_surname',
 allowBlank: false,
 blankText: 'Please fill "Surname" field',                  
},

私の質問は:

同じオブジェクトの別のプロパティ内で Ext.form.field.Text のオブジェクト プロパティを使用する方法はありますか?

何かのようなもの:

{
 xtype: 'textfield',
 fieldLabel: 'Surname',
 name: 'person_surname',
 allowBlank: false,
 blankText: 'Please fill "' + fieldLabel + '" field',                  
},

(動作しません)

また:

{
 xtype: 'textfield',
 fieldLabel: 'Surname',
 name: 'person_surname',
 allowBlank: false,
 blankText: 'Please fill "' + this.fieldLabel + '" field',                  
},

(どちらも機能しません)

アップデート:

たとえば、minLengthTextプロパティでは、「このフィールドの最小長は {0} です」のようなテンプレート主導のテキストを使用できます。これminLengthは、同じオブジェクトのプロパティ値を取ります。

繰り返しますが、次のようなオブジェクト リテラル構文で ExtJS のオブジェクト初期化メソッドを使用します。

{
 xtype: 'textfield',
 fieldLabel: 'Surname',
 name: 'person_surname',
 allowBlank: false,
 blankText: 'Please fill "Surname" field',                  
},

この構文は非常にきれいです。別の構文を使用することはここでは歓迎されません。

4

8 に答える 8

3

オブジェクトを作成し、それへの参照を取得してから、その参照を介して拡張する必要があります。

var obj = {
 xtype: 'textfield',
 fieldLabel: 'Surname',
 name: 'person_surname',
 allowBlank: false
};

obj.blankText = 'Please fill "' + obj.fieldLabel + '" field';
于 2012-08-20T07:16:34.943 に答える
1

いくつかの選択肢:

1)レンダリングリスナーはDOM関連のオブジェクトプロパティを変更するには不十分な場所であるため、これは受け入れられた回答よりも優れています。それはレンダリングサイクルが機能する方法と関係がありますが、前にそれを行う方がはるかに良く、後にそれを行うのは平均的であり、間にそれを行うのは悪いことです。以下の例は、フィールドのフラットリストを扱っている場合にのみ適用できる可能性があります。

Ext.define('MyClass', {

    initComponent: function(){
        var fields = [{
            xtype: 'textfield',
            fieldLabel: 'Field 1'
        }, {
            xtype: 'textfield',
            fieldLabel: 'Field 2'
        }];

        Ext.Array.forEach(fields, function(field){
            field.blankText = 'Foo ' + field.fieldLabel
        });
        this.items = fields;
        this.callParent();
    }

});

2)これにより、フィールドが定義された後も、ほとんどの制御が可能になります。

Ext.define('MyClass', {

    initComponent: function(){
        var wrap = this.wrap;

        this.items = [wrap({
            xtype: 'textfield',
            fieldLabel: 'Field 1'
        }), wrap({
            xtype: 'textfield',
            fieldLabel: 'Field 2'
        })];

        this.callParent();
    },

    wrap: function(config){
        config.blankText = 'Foo ' + config.fieldLabel;
        return config;
    }

});
于 2012-08-20T08:08:35.460 に答える
1

コードを書き直したくない場合は、リスナーをフォームに追加してみてください

listeners : {

               render : function(){
                   Ext.each(form.items.items,function(fld,idx){
                    if(fld.getXType()=='textfield'){
                       fld.blankText = fld.fieldLabel;
                    }
                   });
               }
 }
于 2012-08-20T07:33:29.780 に答える
0

このようなことをしようとすると、実際には3つのオプションがあります。

var Object_1 = {};
Object_1.property_1 = "Something";
Object_1.property_2 = "I'm Really " + Object_1.property_1 + "!";


var Object_2 = {
    property_1 : "Something",
    property_2 : "I'm Really"
};

Object_2.property_2 += Object_2.property_1 + "!";


var Object_3 = (function () {
    var property1 = "Something",
        property2 = "I'm Really " + property1 + "!";

    return { property_1 : property1, property_2 : property2 };
}());

これらの3つのオブジェクトはそれぞれ、ユーザー定義のプロパティに関して同等になります。個人的には、JavaScriptで#3を非常に多く使用しています。これは、現在発生している問題を回避するためです。

プロパティとメソッドを関数内の変数として定義してから、それらの元の変数にアクセスできる関数を返すか、オブジェクト(メソッドを元の関数内で定義されている限り、メソッドをアタッチできます)を返します。 --内部変数にアクセスできます)。

于 2012-08-20T07:27:24.000 に答える
0

簡単なパーサーを書いてみませんか?

{
    xtype: 'textfield',
    fieldLabel: 'Surname',
    name: 'person_surname',
    allowBlank: false,
    blankText: 'Please fill [fieldlabel] field',                  
},

[fieldlabel]メッセージを出力するときに、マクロをオブジェクトの.fieldLabel値に置き換えます。必要な場合があるその他のマクロを追加します。

于 2012-08-20T07:29:14.717 に答える
0

ECMAScript 5 の Getter および Setter機能をサポートするブラウザでコードを実行する場合は、getter を使用して必要なものを実現できます。

{
    xtype: 'textfield',
    fieldLabel: 'Surname',
    name: 'person_surname',
    allowBlank: false,
    get blankText(){ return 'Please fill "' + this.fieldLabel + '" field';}
},
于 2012-08-20T08:00:08.047 に答える
0

私が考えることができる唯一のことは

new function(){
    this.xtype = 'textfield';
    this.fieldLabel = 'Surname';
    this.name = 'person_surname';
    this.allowBlank = false;
    this.blankText = 'Please fill "' + this.fieldLabel + '" field';                  
}
于 2012-08-20T07:14:36.807 に答える