【问题标题】:Sencha Touch 2 - "change" event listener for textfieldSencha Touch 2 - 文本字段的“更改”事件监听器
【发布时间】:2012-05-25 12:39:29
【问题描述】:

我想为文本字段上的更改事件添加一个事件侦听器。我创建了一个包含表单面板的视图 - 到目前为止一切正常。

现在我尝试向其中一个文本字段添加事件侦听器:

  items:[
        {
            xtype    :"textfield",
            name     :"field",
            label    :"field",
            required :true,
            listeners:{
                change:{
                    fn    : "onChangeHandler",
                    scope: this
                },
            }
    },

但它并没有真正起作用..没有任何反应。没有错误,也没有函数调用。我做错了什么?

编辑:

尝试了另一件事 - 直接在项目定义中:

    {
    xtype    :"textfield",
    name     :"field",
    label    :"field",
    required :true,
    listeners:{
        change:{
            fn    :this.onChange
        },
        scope :this
    }
},

但随后在更改时我在控制台上收到此错误:

未捕获的类型错误:无法调用未定义的“应用”方法

【问题讨论】:

    标签: javascript dom-events sencha-touch-2


    【解决方案1】:

    尝试改变这个:

    listeners:{
                            change:{
                                fn    : "onChangeHandler",
                                scope: this
                            },
                        }
    

    到这里:

    listeners:{
                            change: this.onChangeHandler
                        }
    

    更新: 最简单的方法是为你的app.view.Login 设置一个id(比如'abc'),然后:

    fn: function() {Ext.getCmp('abc').onEvent();},
    

    【讨论】:

    • 我试过了,但它不起作用。什么都没有发生...我尝试了另一件事,请参阅我在帖子中的编辑。
    • 你在你的应用中使用控制器吗?如果是,就更容易解决您的问题
    • 不,不适合那种观点。但是,为什么创建一个包含一些元素的表单面板作为视图并在其中定义一些事件侦听器会如此棘手呢?我不知道为什么它不起作用..我已经看到了一些示例,其中包含项目上的侦听器定义和视图中的处理程序。但是这个解决方案只会产生错误消息“Uncaught TypeError: Cannot call method 'apply' of undefined”。
    • 麻烦你的源代码,我不确定你发布的是否真的是原因......
    • 好的,这里是链接:senchafiddle.com/full/!Rk1l0senchafiddle.com/#Rk1l0 .. 我把它最小化了一点,但是错误是一样的。你可以看到我的不同尝试。
    【解决方案2】:

    我认为“this”存在某种范围界定问题。在控制器中处理事件可能会更好。将 id 添加到您的用户名文本字段(id:'username',),然后尝试使用我的控制器。我得到 keyup 和 tap 事件的回调;我在 change 回调之后遇到了某种错误,但它确实触发了。此外,您的 keyup 事件名称错误。 Sencha 为每个对象列出了他们所有的events,我觉得这很有帮助。

    登录控制器

    Ext.define("App.controller.LoginController", { 扩展:“Ext.app.Controller”, 配置:{ 参考:{ 用户名:'#username' }, 控制: { 用户名: { keyup: 'onUsernameKeyUp', 更改:'onUsernameChange' } } }, onUsernameKeyUp:函数(){ console.log("onUsernameKeyUp"); }, onUsernameChange:函数(){ console.log("onUsernameChange"); }, 启动:函数(){ this.callParent(); console.log("启动"); }, 初始化:函数(){ this.callParent(); console.log("init"); } });

    app.js - 添加控制器:[]

    分机应用程序({ 名称:'应用程序', 控制器:['LoginController'], phoneStartupScreen :'resources/loading/Homescreen.jpg', tabletStartupScreen:'resources/loading/Homescreen~ipad.jpg', 启动:函数(){ var loginform = Ext.create("App.view.Login"); Ext.Viewport.add([loginform]); }, });

    【讨论】:

      【解决方案3】:

      您必须将“范围”放入“更改”块中。

      listeners:{
        change:{
          fn    :this.onChange,
          scope :this
        }
      }
      

      你有错误Uncaught TypeError: Cannot call method 'apply' of undefined 因为你写过:

      listeners:{
        change:{
          fn    :this.onChange
          },
          scope :this
      }
      

      你看出区别了吗? :)

      还要检查您是否将侦听器放入“config”块并在“config”块之后执行“onChange”。

      【讨论】:

      • 我都试过了,但没有任何效果。你在煎茶小提琴中试过吗?
      猜你喜欢
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多