Sencha Touch 2:从 Ext.Msg.confirm 中调用控制器功能

Posted

技术标签:

【中文标题】Sencha Touch 2:从 Ext.Msg.confirm 中调用控制器功能【英文标题】:Sencha Touch 2: Call controller function from within Ext.Msg.confirm 【发布时间】:2012-05-24 10:42:22 【问题描述】:

我刚刚开始使用 Sencha Touch 2,之前从未使用过 Sencha Touch 1.x。我刚刚完成了本教程(这是迄今为止我发现的最好的入门教程)http://miamicoder.com/2012/how-to-create-a-sencha-touch-2-app-part-1/,现在我想继续扩展这个 Notes 应用程序。

我有一个控制器和 2 个视图、一个列表视图和一个编辑视图。在编辑视图中,我希望能够删除当前记录。删除功能在控制器中。点击删除按钮后,我想显示一个确认对话框(“您确定要删除...?”)。用户按yes后,应该调用delete函数。

现在我的问题是:如何从 Ext.Msg.confirm 中调用控制器删除功能?

这是我的代码的相关 sn-ps。如果缺少重要的东西,请告诉我。

请参阅“onDeleteNoteCommand”功能。 “this.someFunction”显然不起作用,因为“this”是一个 DOMWindow。

Ext.define('TestApp2.controller.Main', 
extend: 'Ext.app.Controller',

config: 
    refs: 
        noteEditorView: 'noteeditorview'
    ,
    control: 
        noteEditorView: 
            deleteNoteCommand: 'onDeleteNoteCommand',
        
    
,

onDeleteNoteCommand: function() 
    console.log('onDeleteNoteCommand');

    var noteEditor = this.getNoteEditorView();
    var currentNote = noteEditor.getRecord();

    Ext.Msg.confirm(
        "Delete note?",
        "Do you reall want to delete the note <i>"+currentNote.data.title+"</i>?",
        function(buttonId) 
            if(buttonId === 'yes') 
                            //controller functions!! how to call them?
                this.deleteNote(currentNote);                   
                this.activateNotesList();
            
        
    );
,

deleteNote: function(record) 
    var notesStore = Ext.getStore('Notes');
    notesStore.remove(record);
    notesStore.sync();
,

activateNotesList: function() 
    Ext.Viewport.animateActiveItem(this.getNotesListView(), this.slideRightTransition);
,

slideLeftTransition:  type: 'slide', direction: 'left' ,
slideRightTransition:  type: 'slide', direction: 'right' ,

launch: function() 
    this.callParent();
    Ext.getStore('Notes').load();
    console.log('launch main controller');
,
init: function() 
    this.callParent();
    console.log('init main controller');

);

【问题讨论】:

【参考方案1】:

当你进入Ext.Msg的回调函数时,作用域从控制器作用域变为全局作用域(窗口),所以你必须将它设置为confirm方法的参数:

  Ext.Msg.confirm(
      "Delete note?",
      "Do you reall want to delete the note <i>"+currentNote.data.title+"</i>?",
      function(buttonId) 
        if(buttonId === 'yes') 
          this.deleteNote(currentNote);                   
          this.activateNotesList();
        
      , 
      this // scope of the controller 
    );

更多信息请查看 sencha 文档:http://docs.sencha.com/touch/2-0/#!/api/Ext.MessageBox-method-confirm

【讨论】:

您好,感谢您的回答,但我认为您误解了。 onDeleteNoteCommand 事件被正常调用。在“onDeleteNoteCommand”中,我显示了一个确认框。在那里我想调用另一个控制器函数。希望这很清楚。 你只需要添加“this”作为confirm方法的第四个参数:) 哦,谢谢! :-) 如此简单,但我无法弄清楚,即使这里有文档:dev.sencha.com/deploy/ext-1.1.1/docs/output/Ext.MessageBox.html 现在我知道我应该看看 Ext.MessageBox 的公共方法。有范围!

以上是关于Sencha Touch 2:从 Ext.Msg.confirm 中调用控制器功能的主要内容,如果未能解决你的问题,请参考以下文章

将 Sencha Architect 项目从 Sencha Touch v2.0.x 更新到 Sencha Touch 2.1.x

无法使用 sencha cmd 3.1.2.342 从 Sencha touch 项目生成 android apk

从 Sencha Touch 2 跨域更新到外部服务器

如何在 Ext.Msg.show 中包含两个文本框

Sencha Touch 2:如何从面板获取 HTML 以及输入值

Sencha Touch 2 KitchenSink 示例构建失败