Sencha Touch 2 -在MVC中添加监听器的正确方法
Sencha Touch 2 - Correct way to add listeners in the MVC?
今天我有一个小问题,关于使用Sencha Touch 2通过推荐的MVC模型添加侦听器的正确/最佳方法是什么。
据我所知,有两种主要方法可以向视图中的各种组件添加侦听器。
1。
我在阅读ExtJS 4.0的MVC文档时遇到了这个方法(没有MVC文档的触摸)。它是这样的:
init: function() {
console.log ('Launched the controller');
//listening test
//the Control function/method is unique to controllers and is used to add listeners to stuff
this.control({
'button': { 'tap' : function (){
console.log('the buttons speak!');
}
},
}
例如,上面的代码将驻留在主控制器中。在这里,正如你所看到的,我为整个应用程序的所有按钮添加了一个"tap"监听器。
据我所知,要以这种方式访问特定的组件,我需要用唯一的ID标记每个组件,然后在此位置使用componentquery将侦听器放置到它们上。
问题:我觉得这个方法很酷…但我遇到过在列表中使用它的问题……有时我想听一个特定的列表项,比如"tapstart"answers"tapend",但由于通常listtitems是作为列表的子元素动态创建的……我不知道如何给他们唯一的id和/或找到他们使用查询引擎(由于我的经验不足,我猜?我还没能在谷歌上找到任何有意义的文档)。2。在单个组件的init/config中
我遇到的另一种向组件添加侦听器的方法是直接在组件配置中定义侦听器、它的回调和它侦听的事件。
的例子:
Ext.define('Paythread.view.CommentList', {
extend: 'Ext.Panel',
alias: 'widget.CommentList',
layout: 'vbox',
config : {
items: [
{
xtype: 'list',
layout: 'fit', //fullscreen: true,
height: 'viewport.height',
store: 'Comments',
onItemTap: function(){
//do stuff
},
pressedDelay: 20, //HOLY CRAP IMPORTANT FOR UX
itemTpl: '<h1>{user_id}</h1><h2>{comment}</h2>'
}
]
},
});
从这段代码中可以看到,我创建了一个"onItemTap"侦听器函数,这似乎工作得很好。然而……出于某种原因,我害怕,我不知道我所做的是否正确。
谁能提供一些帮助,我是否在做正确的事情,如果我应该做这个不同的方式,或者如果我完全偏离轨道,甚至不应该在第一个地方定义这样的听众?
我将非常感谢任何帮助!非常感谢大家。
添加侦听器的方法在我看来更清晰一些:
Ext.define('Paythread.view.CommentList', {
extend: 'Ext.Panel',
alias: 'widget.CommentList',
layout: 'vbox',
config : {
items: [
{
xtype: 'list',
layout: 'fit', //fullscreen: true,
height: 'viewport.height',
store: 'Comments',
listeners: {
itemtap: function() {
//do stuff
}
}
pressedDelay: 20, //HOLY CRAP IMPORTANT FOR UX
itemTpl: '<h1>{user_id}</h1><h2>{comment}</h2>'
}
]
}
});
轻击列表时将调用轻击函数。听起来很简单。希望能有所帮助,
克里斯既然你问监听列表项上的事件,你可能应该检查:http://www.sencha.com/blog/event-delegation-in-sencha-touch
不幸的是,ST2的语法改变了一点。看看这个帖子:http://www.sencha.com/forum/showthread.php?154513-How-to-buffer-events-without-using-addListener
你必须在列表中添加itemId属性通过使用这个itemId你可以获得列表对象然后你可以添加像这样的侦听器
init: function() {
console.log ('Launched the controller');
//listening test
//the Control function/method is unique to controllers and is used to add listeners to stuff
this.control({
Paythread.view.CommentList.query('itemIdof List')[0].on({
itemtap: function() {
alert('test')
}
});
},
}
这可能对你有帮助
谢谢
有几种添加侦听器的方法,我认为每种方法都有一些注意事项:
我应该把监听器放在控制器上还是放在视图上?
对我来说,这要看情况;如果视图基本上是要重用的组件,则可能希望将元素与事件联系起来。但是,您不应该将事件的逻辑放在视图上。相反,你的视图应该触发一个可以被控制器监听的事件。
的例子:
Ext.define("App.view.SomePanel", {
extend: "Ext.form.Panel",
xtype: "somepanel",
config:{
scrollable:'vertical' ,
},
initialize: function () {
var backButton = {
xtype: "button",
ui: "back",
text: "Home",
handler: this.onBackButtonTap,
scope: this
};
this.add([
{
xtype: "toolbar",
docked: "top",
title: "Edit Player",
items: [ backButton ]
}
]);
},
onBackButtonTap: function () {
this.fireEvent("goBackCommand", this);
}
});
在这个面板上,我们有一个后退按钮。视图不应该处理后退按钮的操作(因为它取决于应用程序的流程,而不是视图本身),但它应该触发一个事件,我们可以在控制器上捕捉到。
您应该始终考虑的另一个非常重要的事情是侦听器的scope
。基本上,作用域意味着this
在事件触发的函数中具有的值。(本例中为视图本身)
希望这对你有帮助!
编辑:链接到Sencha事件指南:
http://docs.sencha.com/touch/2-0/!事件/指导/
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 数组在递归方法中设置为null
- 打破承诺链的好方法是什么
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 使用“;这个“;JavaScript原型方法中的关键字
- 序列化数据属性中对象的最可靠方法
- 使用Objective-C的JavaScript注入方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- toBoolean方法类似于toString
- 如何在单击复选框后调用控制器方法
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 在使用AJAX获取html内容后,向新元素添加监听器的正确方法是什么?(jQuery,Javascript)
- 对象方法Javascript HTML DOM中的多个事件监听器
- Sencha Touch 2 -在MVC中添加监听器的正确方法
- 自动绑定模板中的监听器方法?1.0(聚合物)
- 事件监听器在initComponent中声明时没有调用控制器方法
- 用类方法调用的Javascript事件监听器