2012-01-30 58 views
1

我有一个sencha触摸的奇怪问题。 更改屏幕上卡住的选择区域中的值。我有一个应用程序,其中有选择字段,并在更改选择字段值时,我正在应用一些规则。规则是删除所有屏幕元素并新添加它。屏幕卡在sencha触摸选择字段更改监听器

下面是代码快照。

现在,它与铬,safari浏览器和iPad设备浏览器工作得很好。但是现在它给iPhone和Android设备带来了奇怪的问题。屏幕卡住了。更改选择字段中的值后,不允许发生任何事件。

采取的步骤;另外,我在源代码的每一步都将警报作为记录器来确保无限循环。我还将异常处理程序确保发生错误。没有错误,既不会造成内存/运行时问题,也不会出现无限循环运行。

App.views.MySampleScreen = Ext.extend(Ext.Panel, { 
     initComponent : function() { 
      var titlebar = { 
       dock : 'top', 
       xtype : 'toolbar', 
       cls: 'x-panel-title', 
       title : "Home Screen"  
      }; 

      var buttonbar = { 
       xtype : 'toolbar', 
       dock : 'bottom', 
       cls: 'x-panel-footer', 
       items : [ 
        {xtype : "spacer"}     
       ] 
      }; 


      var myFieldSet = new Ext.form.FieldSet({ 
       xtype: 'fieldset', 
       id : 'myFieldSet', 
       name: 'myFieldSet' 

      }); 

      var formBase = new Ext.form.FormPanel({ 
       ui: 'round', 
       id: 'standardFormBase', 
       items: [myFieldSet], 
      }); 

      Ext.apply(this, { 
       scroll: 'vertical', 
       pinHeaders: true, 
       dockedItems : [titlebar, buttonbar], 
       items : [formBase], 

       listeners: { 
        beforeactivate: function(panel) { 
         createAndInitScreen(); 
        } 
        } 
      }); 

      App.views.MySampleScreen.superclass.initComponent.call(this); 
     } 

    }); 

    Ext.reg('App.views.MySampleScreen', App.views.MySampleScreen); 

    function createAndInitScreen(){ 

     var myFieldSet = Ext.getCmp("myFieldSet"); 
     myFieldSet.removeAll(true); 

     var stateList2 = new Ext.form.Select({ 
      label: 'State', 
      name: 'state', 
      id: 'stateLis2t', 
      widht: '100%', 
      autoLoad: true, 
      labelWidth: '40%', 
      options: [{ 
          text: 'Test', value: 'Test' 
         }, { 
          text: 'Test2', value: 'Test2' 
         }, { 
          text: 'Test3', value: 'Test3' 
         }], 
      listeners: { 
       afterrender: function(ele) { 

       }, 
       change: function(field, value) { 
        createAndInitScreen(); // Here is the problem 
         // if i remove this then this works, but my need 
         //is to call CreateAndInitScreen after value change in select() 
       }    
      } 
     }); 

     myFieldSet.items.add(stateList2); 

     myFieldSet.show(); 
     myFieldSet.doLayout();  
} 
+0

尝试删除stateList2的id属性。您正在创建更多具有相同ID的'Ext.form.Select'对象。这可能会导致奇怪的问题... – ilija139 2012-02-01 10:23:37

+0

@ ilija139我已经从Ext.form.Select中删除了Id属性。但问题仍然存在。 – 2012-02-01 10:43:27

+0

然后我不知道。你应该改变整个代码。如果你想改变'form.Select'中的项目,那么你需要删除项目并添加新的项目,而不是删除整个对象,然后创建一个新项目。代码结构不好,你可能会耗尽内存或类似的东西,或者一些不定式的循环(事件或递归)。 – ilija139 2012-02-01 10:48:24

回答

0

我已经解决了这个问题。我不是每次创建控件,而是从屏幕元素中删除和添加数据。 Thant适合我的要求。无论如何谢谢大家的支持。

0

我可能发现了这个错误。

selectfield无法计算出iPhone屏幕的高度。

在iPad上计算高度,以便selectfield picker显示屏幕的其余部分被屏蔽,直到您解除选取器为止。

在iPhone上,选取器实际上是在屏幕上创建和绘制的,因为屏幕被假定为更大,所以它不可见。即拾取器在屏幕上较低(在不可见部分),感觉屏幕卡住/停顿,因为仍然出现掩盖

如果您减少相关面板的高度(考虑到iPhone屏幕高度),你应该拥有的一切完美的工作。

希望这可以帮助别人。上帝知道我花足够的时间找到它!:)