5

インライン編集フォームを作成しようとしています。次のようなフォームがあります。

var editPic = "<img src='https://s3.amazonaws.com/bzimages/pencil.png' alt='edit' height='24' width='24' style='margin-left: 10px;'/>";
var submitPic = "<img id='submitPic' src='https://s3.amazonaws.com/bzimages/submitPic.png' alt='edit' height='24' width='24'/>";

Ext.define('BM.view.test.Edit', {
extend: 'Ext.form.Panel',
alias: 'widget.test-edit',

layout: 'anchor',
title: 'Edit Test',
defaultType: 'displayfield',

items: [
    {name: 'id', hidden: true},

    {
        name: 'name',
        fieldLabel: 'Name',
        afterSubTpl: editPic,
        cls: 'editable'
    },
    {
        name: 'nameEdit',
        fieldLabel: 'Name',
        xtype: 'textfield',
        hidden: true,
        cls: 'editMode',
        allowBlank: false,
        afterSubTpl: submitPic
    }
]
});

コントローラーは次のようになります (多くのイベント)。

init: function() {
    this.control({
        'test-edit > displayfield': {
            afterrender: this.showEditable
        },
        'test-edit': {
            afterrender: this.formRendered
        },
        'test-edit > field[cls=editMode]': {
            specialkey: this.editField,
            blur: this.outOfFocus
        }
    });
},

outOfFocus: function(field, event) {
    console.log('Lost focus');
    this.revertToDisplayField(field);
},

revertToDisplayField: function(field) {
    field.previousNode().show();
    field.hide();
},

formRendered: function(form) {
    Ext.get('submitPic').on('click', function (event, object) {
        var field = Ext.get(object).parent().parent().parent().parent();
        var cmp = Ext.ComponentQuery.query('test-edit > field[cls=editMode]');
    });
},

editField: function(field, e) {
    var value = field.value;
    if (e.getKey() === e.ENTER) {
        if (!field.allowBlank && Ext.isEmpty(value)){
            console.log('Not permitted!');
        } else {
            var record = Ext.ComponentQuery.query('test-edit')[0].getForm().getRecord();
            Ext.Ajax.request({
                url: '../webapp/tests/update',
                method:'Post',
                params: {
                    id: record.getId(),
                    fieldName: field.name,
                    fieldValue: field.value
                },
                store: record.store,
                success: function(response, t){
                    field.previousNode().setValue(value);
                    t.store.reload();
                    var text = response.responseText;
                    // process server response here
                    console.log('Update successful!');
                }
            });

        }
        this.revertToDisplayField(field);

    } else if (e.getKey() === e.ESC) {
        console.log('gave up');
        this.revertToDisplayField(field);
    }
},

showEditable: function(df) {
    df.getEl().on("click", handleClick, this, df);

    function handleClick(e, t, df){
        e.preventDefault();
        var editable = df.nextNode();
        editable.setValue(df.getValue());
        editable.show();
        editable.focus();
        df.hide();
    }
},

「afterSubTpl」構成を使用して、編集アイコンと受け入れアイコンを追加しています。それらに関するクリックイベントをリッスンするようにリスナーを設定しましたが、クリックされた後は、Ext.get('submitPic') によって作成された要素しかありません。ここで、Ext フィールドとそれを囲むフォームにアクセスしたいと考えています。親メソッドは、他の DOM 要素のみを返します。それらの間をどのように接続しますか?formRendered で試したことを確認できます。

誰かが私のためにこれを少し明確にしてくれることを願っています.

4

2 に答える 2

3

id でコンポーネントを取得できますが、コンポーネントとその dom 要素が同じ id を持っている場合に限ります (通常は同じです)。

Ext.getCmp(yourelement.id)

しかし、これは正確な方法ではありません。ハンドラ メソッドがすでにコンポーネントへの参照を持っているようにリスナーを設定する方がよいでしょう。たとえば、「submitPic」コンポーネントでは、次のようにクリック リスナーを定義できます。

var me = this;
me.on({
    click: function(arguments){
         var cmp = me;
         ...

});
于 2013-02-23T05:13:01.680 に答える