Sencha touch Sencha Touch:TextField上的设置值不起作用

Sencha touch Sencha Touch:TextField上的设置值不起作用,sencha-touch,Sencha Touch,在Sencha Touch 2中,我有一个控制器,在点击按钮时调用自定义的“预填充”方法: Ext.Ajax.request ({ method: 'GET', url: myurl, //defined outside withCredentials: true, headers:{Authorization : auth}, success: function(response){

在Sencha Touch 2中,我有一个控制器,在点击按钮时调用自定义的“预填充”方法:

Ext.Ajax.request
    ({  
        method: 'GET',
        url:  myurl, //defined outside
        withCredentials: true,
        headers:{Authorization : auth},
        success: function(response){

            var data; 

            if(response.responseText.length > 0)
                  data = Ext.JSON.decode(response.responseText.trim());

            console.log(data);

            var fv = me.getFiscal();

            console.log(fv);

            fv.prepopulate(data);

            Ext.Viewport.animateActiveItem('fiscal', me.getSlideLeftTransition());
        },
        failure: function(response){
            Ext.Msg.alert('Server Error', 'Server down :( please try again later');
        }
    }


    );
查看代码:

prepopulate : function (data) {

    var me = this;


    var companyTextField = me.down('#fiscalForm').down('#companyTextField');
    var vatField = me.down('#fiscalForm').down('#vatField');

    var fiscalCodeTextField = me.down('#fiscalForm').down('#fiscalCodeTextField');
    var addressTextField = me.down('#fiscalForm').down('#addressTextField');

    var cityTextField = me.down('#fiscalForm').down('#cityTextField');
    var zipTextField = me.down('#fiscalForm').down('#zipTextField');

    var countryTextField = me.down('#fiscalForm').down('#countryTextField');
    console.log(vatField);
    console.log((data.vat));
    if(data){

        if(data.company_name)
            companyTextField.setValue(data.company_name);
        if(data.vat)
            vatField.setValue(data.vat);
        if(data.fiscal_code)
            fiscalCodeTextField.setValue(data.fiscal_code);
        if(data.address)
            addressTextField.setValue(data.address);
        if(data.city)
            cityTextField.setValue(data.city);
        if(data.zip)
            zipTextField.setValue(data.zip);
        if(data.country)
            countryTextField.setValue(data.country);

    }
    console.log(vatField);
}
AJAX调用工作正常,它在成功时调用prepopulate方法传递从服务器检索到的数据。 我尝试使用setValue()初始化文本字段,但当我使用浏览器打开表单时,它看起来是“全新的” console.log()告诉我_valueprivate字段设置正确,但是。。。我现在在黑暗中摸索。。。有什么见解吗

先谢谢你


M.

正如您所建议的那样,我正确地检索了数据,并将其与console.log一起显示在控制台中,但是在调用setValue()时,浏览器找不到任何可见字段来修改该值

到目前为止,解决方案是修改ajax请求,如下所示:

Ext.Ajax.request
({  
....
....
    success: function(response){
    ....
        Ext.Viewport.animateActiveItem('fiscal', me.getSlideLeftTransition());

                    //view must be in the viewport before modifying data:
        var task = Ext.create('Ext.util.DelayedTask', function () {
                var fv = me.getFiscal();
                fv.prepopulate(data);
        });
        task.delay(1000);
.....
....
...
..
.

嗯,我不认为这是一个解决办法(没有冒犯的意思)。等待任意时间,然后设置值是一种容易出现竞争条件的黑客行为。就我个人而言,我会在表单组件上使用setValues,而不是手动设置各个字段的值。使用setValues时,表单是否尚未呈现并不重要。因此,给字段一个“name”属性,并在对象中引用该名称以传递给setValues。另一种方法是创建一个模型实例并使用setRecord。谢谢!我将在sencha上试用,一定有更强大的解决方案:)看起来像是这样